Eri*_*ura 168 c++ standard-library c++11
存在的原因是std::decay什么?在什么情况下std::decay有用?
T.C*_*.C. 165
<笑话>它显然用于将放射性std::atomic类型衰变为非放射性类型.</ joke>
N2609是提出的论文std::decay.该文件解释说:
简单地说,
decay<T>::type是标识类型转换,除非T是数组类型或对函数类型的引用.在这些情况下,分别decay<T>::type产生指针或指向函数的指针.
激励的例子是C++ 03 std::make_pair:
template <class T1, class T2>
inline pair<T1,T2> make_pair(T1 x, T2 y)
{
return pair<T1,T2>(x, y);
}
Run Code Online (Sandbox Code Playgroud)
它按值接受其参数以使字符串文字起作用:
std::pair<std::string, int> p = make_pair("foo", 0);
Run Code Online (Sandbox Code Playgroud)
如果它通过引用接受它的参数,那么T1将推断为数组类型,然后构造一个pair<T1, T2>将是格式错误的.
但显然这会导致效率低下.因此,需要decay应用在按值传递时发生的转换集,允许您通过引用获得获取参数的效率,但仍然可以获得代码使用字符串文字所需的类型转换,数组类型,函数类型等:
template <class T1, class T2>
inline pair< typename decay<T1>::type, typename decay<T2>::type >
make_pair(T1&& x, T2&& y)
{
return pair< typename decay<T1>::type,
typename decay<T2>::type >(std::forward<T1>(x),
std::forward<T2>(y));
}
Run Code Online (Sandbox Code Playgroud)
注意:这不是实际的C++ 11 make_pair实现 - C++ 11 make_pair也可以解包std::reference_wrapper.
Moo*_*uck 59
处理带有模板类型参数的模板函数时,通常会有通用参数.通用参数几乎总是一种或另一种参考.他们也是const-volatile合格的.因此,大多数类型的特征不能像你期望的那样对它们起作用:
template<class T>
void func(T&& param) {
if (std::is_same<T,int>::value)
std::cout << "param is an int\n";
else
std::cout << "param is not an int\n";
}
int main() {
int three = 3;
func(three); //prints "param is not an int"!!!!
}
Run Code Online (Sandbox Code Playgroud)
http://coliru.stacked-crooked.com/a/24476e60bd906bed
这里的解决方案是使用std::decay:
template<class T>
void func(T&& param) {
if (std::is_same<typename std::decay<T>::type,int>::value)
std::cout << "param is an int\n";
else
std::cout << "param is not an int\n";
}
Run Code Online (Sandbox Code Playgroud)
http://coliru.stacked-crooked.com/a/8cbd0119a28a18bd