如何正确编写尾随返回类型?

时间:2012-12-29 08:49:47

标签: c++ c++11 trailing-return-type

假设我有这个功能模板:

template<typename T1, typename T2>
auto DoSomething(const T1& arg);

当然这个函数需要一个尾随返回类型,考虑到函数的用途,我真的不能正确。

这个函数应该做的是使用arg,对argT2对象进行一些操作,并使用该操作的结果作为函数的返回值。显然,DoSomething()的返回类型必须(兼容)与为argT2对象执行的操作的返回类型匹配。

再次假设我们让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作为尾随返回类型。他们都没有工作。

1 个答案:

答案 0 :(得分:10)

您应该使用decltypestd::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拥有默认构造函数,

也应该有效