获取 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;你可以看到它正确地推导出 double
和 int *
分别为 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
。
我正在尝试确定重载成员函数的 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;你可以看到它正确地推导出 double
和 int *
分别为 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
。