什么是std :: decay,什么时候应该使用?
std::decay
存在的原因是什么? std::decay
在什么情况下有用?
<笑话>它显然是用来衰减放射性std::atomic
types为非放射性的</ joke>
N2609是提出std::decay
的论文。 该文件解释说:
简单地说,
decay<T>::type
是标识types转换,除非T是数组types或对函数types的引用。 在这些情况下,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); }
它通过值接受它的参数使string文字工作:
std::pair<std::string, int> p = make_pair("foo", 0);
如果通过引用接受它的参数,则T1
将被推导为一个数组types,然后构造一个pair<T1, T2>
将是格式不正确的。
但显然这导致显着的低效率。 因此,需要decay
,应用传值时发生的一组转换,使您可以通过引用获得参数的效率,但仍然可以获得代码使用string文字所需的types转换,数组types,函数types等等:
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)); }
注意:这不是实际的C ++ 11 make_pair
实现 – C ++ 11 make_pair
也解开了std::reference_wrapper
。
在处理模板types参数的模板函数时,您经常使用通用参数。 通用参数几乎总是参考一种或另一种。 他们也是常数不稳定的资格。 因此,大多数types特征并不像你所期望的那样工作:
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"!!!! }
http://coliru.stacked-crooked.com/a/24476e60bd906bed
这里的解决scheme是使用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"; }