7

假设我有这个函数模板:

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

当然,这个函数需要一个尾随返回类型,考虑到函数的目的,我真的做错了。

这个函数应该做的是使用,对一个对象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;
}

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


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

4

1 回答 1

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

于 2012-12-29T09:01:12.577 回答