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

Mar*_*cia 7 c++ c++11 trailing-return-type

假设我有这个功能模板:

template<typename T1, typename T2>
auto DoSomething(const T1& arg);
Run Code Online (Sandbox Code Playgroud)

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

这个函数应该做的是使用和对象arg做一些操作,并使用该操作的结果作为函数的返回值.显然,返回类型必须(兼容)与为对象和对象完成的操作的返回类型匹配.argT2DoSomething()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;
}
Run Code Online (Sandbox Code Playgroud)

那么我应该如何为此形成尾随返回类型?


PS:我已尝试使用decltype(arg * T2),decltype(T1 * T2)以及decltype(T1::operator * (T2))其他一些看起来很奇怪decltype的尾随返回类型.他们都没有工作.

Naw*_*waz 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;
}
Run Code Online (Sandbox Code Playgroud)

因为T2可能没有默认构造函数,所以decltype(arg *T2())可能无效.

但后来我也注意到如果T2没有默认构造函数,那么你也无法编写T2 t2Obj.因此,如果需要 T2默认构造函数,那么您只需编写:

-> decltype(arg *T2()) //requirement : T2 must have default constructor
Run Code Online (Sandbox Code Playgroud)

如果你需要默认构造函数,这也应该工作! T2

  • @MarkGarcia,错误是恶意的,但添加默认构造函数修复了所有内容:http://liveworkspace.org/code/XOkoh$9.当然,既然我知道`std :: declval`,我建议它,因为它适用于所有东西. (2认同)