C++: Standard Type Transformation Templates
整理自 C++ Primer, 5th Edition
前面在 C++: 6 things you must know about functions 的 Trailing Return Type 小节我们介绍了一个例子:
// a trailing return lets us declare the return type after the parameter list is seen
template <typename It>
auto fcn(It beg, It end) -> decltype(*beg) {
// process the range
return *beg; // return a reference to an element from the range
}
现在我们有一个新的要求:如果 decltype(*beg)
是 reference 的话,这个函数就是 return by reference;现在我们希望把它变成 return by value,该怎么做?
这个时候就可以用 Type Transformation Template 了:
- Type Transformation Template 并没有要求只能在 template function 中使用
具体到我们这个场景,使用 remove_reference
就好了,transform 之后的新类型保存在一个 public member type
中:
remove_reference<decltype(*beg)>::type // value type of decltype(*beg)
于是上面那个例子就可以写成:
template <typename It>
auto fcn2(It beg, It end) ->
typename remove_reference<decltype(*beg)>::type { // "typename" keyword is necessary here
// process the range
return *beg; // return a copy of an element from the range
}
Comments