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

时间:2015-01-15 17:13:21

标签: c++ templates overloading return-type

我正在尝试确定重载成员函数的返回类型,以便稍后在我的函数模板中使用该类型(请参阅下面的示例)。无法弄清楚如何使用C ++ 11模板机制(不修改下面代码中结构A和B的定义)。这是可行的(一般是C ++ 11,特别是MSVS2013)以及如何?

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);
}

3 个答案:

答案 0 :(得分:8)

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

typename R = decltype(std::declval<X>().f(std::declval<T&>()))
输出R类型ID的

Here is a demo;您可以看到它分别为doubleint *正确推导出ff(a)ff(b)


附注:模板功能的整个主体可以缩小为return X().f(arg);

答案 1 :(得分:1)

您也可以使用C ++ 14自动返回类型演绎:

template<typename T>
auto ff(T& arg)
{
    X x;
    auto r = x.f(arg);
    return r;
}

答案 2 :(得分:1)

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

template <typename T>
auto ff(T&& arg) -> decltype(std::declval<X>().f(arg))
{
    return X().f(arg);
}

在C ++ 14中,你甚至可以省略后期返回类型,让编译器自己确定所有内容,就像在Baum mit Augen的回答中一样。

修改:使非延迟可构造类型X的延迟返回类型工作。