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

Pow*_*mer 2 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);
}
Run Code Online (Sandbox Code Playgroud)

cdh*_*wie 8

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

typename R = decltype(std::declval<X>().f(std::declval<T&>()))
Run Code Online (Sandbox Code Playgroud)

这是一个输出类型ID的演示R ; 你可以看到它正确推断double和int *for ff(a)和ff(b).


旁注:您的模板功能的整个主体可以减少到return X().f(arg);.