【问题标题】:How do I properly write trailing return type?如何正确编写尾随返回类型?
【发布时间】:2014-02-11 14:41:39
【问题描述】:

假设我有这个函数模板:

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

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

这个函数应该做的是使用arg,对arg和一个T2对象做一些操作,并将操作的结果作为函数的返回值。显然,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)) 以及其他一些看起来很奇怪的 decltypes 作为尾随返回类型。他们都没有工作。

【问题讨论】:

  • 我错了,还是应该-&gt; decltype(arg * T2()) 工作?
  • 我不太确定它是否正确。我发现没有后缀返回(例如herehere)似乎是解释它的常用方法,那就是*(T2 *)(0)。也许这是为了避免需要默认构造函数?

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


【解决方案1】:

您应该使用decltypestd::declval&lt;&gt; 作为:

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 拥有默认构造函数,这也应该可以工作!

【讨论】:

  • 甜蜜,这很容易超过我要发布的内容。
  • @MarkGarcia:看我的回答,编辑它几乎没有解释。
  • @MarkGarcia,错误是恶意的,但添加默认构造函数可以解决所有问题:liveworkspace.org/code/XOkoh$9。当然,既然我知道std::declval,我会推荐它,因为它适用于所有事情。
  • 当然,还有@chris,感谢您的洞察力。毕竟我没那么傻。
猜你喜欢
  • 2011-11-29
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 2011-11-07
  • 2017-08-02
  • 1970-01-01
相关资源
最近更新 更多