C++之std::decay

1.简介

std::decay是C++11之后引进的模板编程工具,它的主要作用是将给定的类型T转换为它的“衰变”类型。这个“衰变”类型是指去除类型T的所有引用、常量和易变性限定符,以及将所有数组和函数转换为对应的指针类型后得到的类型;在头文件  中定义:

template< class T >
struct decay;

2.辅助类

2.1.std::remove_reference和std::remove_reference_t

先看实现:

template 
struct remove_reference {
    using type                 = _Ty;
    using _Const_thru_ref_type = const _Ty;
};

template 
struct remove_reference<_Ty&> {       //左值引用
    using type                 = _Ty;
    using _Const_thru_ref_type = const _Ty&;
};

template 
struct remove_reference<_Ty&&> {       //右值引用
    using type                 = _Ty;
    using _Const_thru_ref_type = const _Ty&&;
};

template 
using remove_reference_t = typename remove_reference<_Ty>::type;

从上面的代码实现来看,它的作用就是擦除类型引用,无论是左值引用还是右值引用,例如,如果_Ty是int&int&&,那么std::remove_reference_t<_Ty>就是int。示例如下:

#include  // std::cout
#include  // std::is_same
 
template
void print_is_same() {
  std::cout << std::is_same() << '\n';
}
 
int main() {
  std::cout << std::boolalpha;
 
  print_is_same();   //输出: true
  print_is_same();  //输出: false
  print_is_same();  //输出: false
 
  print_is_same::type>(); //输出: true
  print_is_same::type>(); //输出: true
  print_is_same::type>(); //输出: true
}

2.2.std::remove_cv

用于擦除类型的const和volatile限定符,返回的是一个去除了const和volatile限定符的类型,例如,如果T是const intvolatile int,那么std::remove_cv_t就是int它的实现如下:

template 
struct remove_cv { // remove top-level const and volatile qualifiers
    using type = _Ty;

    template