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
你应该使用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;
}
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
| 归档时间: |
|
| 查看次数: |
355 次 |
| 最近记录: |