一、std::decay
本来是想把它和std::common_type一起分析来,后来发现这两个的内容都不小,所以又分了开来。在前面的文章中专门写过decay的基本说明,这里就不再重复,有兴趣可以看看“跟我学c++中级篇——decay”,言简意赅的说下其功能:
一般它在元编程使用比较多,并且其只能用于模板参数,如果应用于普通参数则编译无法通过。它的基本功能为:
1、它可将数组退化为指针
2、可以删除CV限定符和引用
3、可以将T转为T*,如(void(char))-> void()(char)
基本上来说,如果T为U的数组或者其引用,则类型为U;如果是函数类型或者其引用则type 是std::add_pointer::type,等同于std::remove_cv<std::remove_reference::type>::type,也就是前面提到的去除CV限定符和引用。另外在C++14中增加了std::decay_t,省了些流程。
二、应用
在实际的应用场景中,有的时候其实是不需要各种附加条件的或者某些特定的场景,有限定符反而会导致编译错误,最典型的是线程内使用数据时是无法使用数组的,那么使用模板编程时传进去的数组就需要退化为指针。同样,有时候只需要原始的数据类型,在模板编程中就可以通过其进行退化得到原始类型进行操作。
当然,在模板编程中,如果对一些参数进行相似的处理时,也需要通过std::decay 来转换参数类型,从而统一入口进行控制。另外在前面的decltype应用中可以看到,std::decay可以拿到原始类型进行处理。比如返回值只需要原始类型即可,那么就可以用其将得到的类型进行退化。
看下面的例子分析:
#include <iostream>
#include <type_traits>
template <class T> void Test(T&& t) {
static_assert(std::is_same<typename std::decay<T>::type, int>::value, "equal");
}
int main() {
doubl