我正在尝试确定重载成员函数的返回类型,以便稍后在我的函数模板中使用该类型(请参阅下面的示例)。无法弄清楚如何使用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);
}
答案 0 :(得分:8)
您可以使用decltype()
,使用std::declval
来模拟创建方法调用表达式所需类型的值:
typename R = decltype(std::declval<X>().f(std::declval<T&>()))
输出R
类型ID的 Here is a demo;您可以看到它分别为double
和int *
正确推导出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
的延迟返回类型工作。