如何正确地编写尾随返回类型
How do I properly write trailing return type?
假设我有这个函数模板:
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;
}
我应该如何形成尾随返回类型?
注:我试过使用decltype(arg * T2)
, decltype(T1 * T2)
和decltype(T1::operator * (T2))
以及其他一些非常奇怪的decltype
作为尾随返回类型。
您应该使用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
有默认构造函数,应该也可以工作!
相关文章:
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- C++:如何正确地将 deque::front() 返回的变量从函数中传递出去?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- 如何高效/正确地存储等距游戏的不同类(单个超类的所有子类型)的地图?
- 返回类型不正确
- clang 拒绝具有尾随 decltype 返回类型的模板调用是否正确,具体取决于其重载之一?
- 如何允许编译器推断出正确的返回类型以进行模板get函数
- 自动无法推断出正确的返回类型
- 如何使模板化运算符推断出正确的返回类型
- 如何正确地将向量<int>转换为空隙*并返回向量<int>?
- 正确使用 std::enable_if 作为返回类型
- 无法确定正确的返回类型
- 如何在C++中正确地返回运算符(*,/,-,+)
- 如何正确地对数据开始指针进行类型转换(这是一种很好的做法吗)
- 如何正确地从dll返回std::list
- 正确地返回一个唯一的ptr
- 如何有条件地编译返回类型的模板化函数
- Doxygen不能正确确定返回类型
- 如何正确推断模板的返回类型
- 如何正确地编写尾随返回类型