我正在尝试确定重载成员函数的返回类型,以便以后在函数模板中使用该类型(参见下面的示例)。无法理解如何使用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);
}发布于 2015-01-15 17:16:47
为此,可以使用decltype(),使用std::declval模拟创建方法调用表达式所需的类型的值:
typename R = decltype(std::declval<X>().f(std::declval<T&>()))这是一个演示,它输出R的类型ID;您可以看到它分别为ff(a)和ff(b)正确地演绎了double和int *。
附带注意:模板函数的整个主体可以简化为return X().f(arg);。
发布于 2015-01-15 17:30:51
您还可以使用以下C++14自动返回类型扣减:
template<typename T>
auto ff(T& arg)
{
X x;
auto r = x.f(arg);
return r;
}发布于 2015-01-15 19:08:31
在C++11中,可以使用延迟返回类型:
template <typename T>
auto ff(T&& arg) -> decltype(std::declval<X>().f(arg))
{
return X().f(arg);
}在C++14中,您甚至可以省略迟返回类型,让编译器自己决定一切,就像Baum的答案一样。
编辑:使非默认可构造类型X的晚返回类型工作。
https://stackoverflow.com/questions/27969105
复制相似问题