获取 return 类型的重载成员函数

Getting return type of an overloaded member function

我正在尝试确定重载成员函数的 return 类型,以便稍后在我的函数模板中使用该类型(参见下面的示例)。无法弄清楚如何使用 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);
}

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

typename R = decltype(std::declval<X>().f(std::declval<T&>()))

Here is a demo 输出R的类型ID;你可以看到它正确地推导出 doubleint * 分别为 ff(a)ff(b)


旁注:模板函数的整个主体可以缩减为 return X().f(arg);

您还可以像这样使用 C++14 自动 return 类型推导:

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

在 C++11 中,您可以使用后期 return 类型:

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

在 C++14 中,您甚至可以省略后期的 return 类型,让编译器自行决定一切,就像 Baum mit Augen 的回答一样。

编辑: 使后期的 return 类型适用于非默认可构造类型 X