假设我有这个功能模板:
template<typename T1, typename T2>
auto DoSomething(const T1& arg);
当然这个函数需要一个尾随返回类型,考虑到函数的用途,我真的不能正确。
这个函数应该做的是使用arg
,对arg
和T2
对象进行一些操作,并使用该操作的结果作为函数的返回值。显然,DoSomething()
的返回类型必须(兼容)与为arg
和T2
对象执行的操作的返回类型匹配。
再次假设我们让DoSomething()
做一些真正的操作,比如乘法。然后我们会像下面的代码一样编写DoSomething()
:
template<typename T1, typename T2>
auto DoSomething(const T1& arg) -> /* trailing return-type */ {
T2 t2Obj; // Or have it obtained in some other way
return arg * t2Obj;
}
我应该如何为此形成尾随的返回类型?
P.S。:我尝试使用decltype(arg * T2)
,decltype(T1 * T2)
和decltype(T1::operator * (T2))
以及其他一些非常奇怪的decltype
作为尾随返回类型。他们都没有工作。
答案 0 :(得分:10)
您应该使用decltype
和std::declval<>
作为:
template<typename T1, typename T2>
auto DoSomething(const T1& arg) -> decltype(arg * std::declval<T2>())
{
T2 t2Obj; // Or have it obtained in some other way
return arg * t2Obj;
}
因为T2
可能没有默认构造函数,所以decltype(arg *T2())
可能无效。
但是我还注意到如果T2
没有默认构造函数,那么不也可以写T2 t2Obj
。所以如果你要求 T2
拥有默认构造函数,那么你可以简单地写一下:
-> decltype(arg *T2()) //requirement : T2 must have default constructor
如果您要求 T2
拥有默认构造函数,也应该有效