首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取重载成员函数的返回类型

获取重载成员函数的返回类型
EN

Stack Overflow用户
提问于 2015-01-15 17:13:21
回答 3查看 138关注 0票数 2

我正在尝试确定重载成员函数的返回类型,以便以后在函数模板中使用该类型(参见下面的示例)。无法理解如何使用C++11模板机器(而不修改下面代码中的结构A和B的定义)。这是否可行(一般情况下是C++11,特别是MSVS2013 ),以及如何做到?

代码语言:javascript
复制
struct A{};
struct B{};

struct X
{
    double f(A&);
    int* f(B&);
};

template<typename T, typename R = /*??? what X::f(T) returns ???*/>
R ff(T& arg)
{
    X x;
    R r = x.f(arg); // preferably if I can create local variables of type R here
    return r;
}

int main()
{
    A a; ff(a);
    B b; ff(b);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-15 17:16:47

为此,可以使用decltype(),使用std::declval模拟创建方法调用表达式所需的类型的值:

代码语言:javascript
复制
typename R = decltype(std::declval<X>().f(std::declval<T&>()))

这是一个演示,它输出R的类型ID;您可以看到它分别为ff(a)ff(b)正确地演绎了doubleint *

附带注意:模板函数的整个主体可以简化为return X().f(arg);

票数 8
EN

Stack Overflow用户

发布于 2015-01-15 17:30:51

您还可以使用以下C++14自动返回类型扣减:

代码语言:javascript
复制
template<typename T>
auto ff(T& arg)
{
    X x;
    auto r = x.f(arg);
    return r;
}
票数 1
EN

Stack Overflow用户

发布于 2015-01-15 19:08:31

在C++11中,可以使用延迟返回类型:

代码语言:javascript
复制
template <typename T>
auto ff(T&& arg) -> decltype(std::declval<X>().f(arg))
{
    return X().f(arg);
}

在C++14中,您甚至可以省略迟返回类型,让编译器自己决定一切,就像Baum的答案一样。

编辑:使非默认可构造类型X的晚返回类型工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27969105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档