首页 > 编程笔记 > C++笔记 阅读:5

C++ type_traits类型萃取的用法(附带实例)

在 type_traits 头文件中包含了许多模板类和函数,用于在编译期间进行类型特性的推导和查询。type_traits 提供了编译时的类型信息,可以在编译期间根据类型的特点进行条件编译和模板特化。

以下是 C++11 中常用的 type_traits 类(或者称为元函数)和函数的一些介绍,代码如下:
std::is_same<T1,T2>::value;        //判断两种类型是否相同
std::is_integral<T>::value;             //判断一种类型是否为整型,包括bool、char、short等
std::is_floating_point<T>::value;    //判断一种类型是否为浮点型,包括float、double等
std::is_pointer<T>::value;               //判断一种类型是否为指针类型
std::is_array<T>::value;                 //判断一种类型是否为数组类型
std::is_enum<T>::value;                  //判断一种类型是否为枚举类型
std::is_reference<T>::value;             //判断一种类型是否为引用类型
std::is_const<T>::value;                 //判断一种类型是否为const限定的类型
std::add_const<T>::type;                 //将一种类型添加const限定
std::remove_const<T>::type;              //移除一种类型的const限定

std::enable_if<>:根据类型的条件判断启用某个函数模板。如果条件满足,则返回的内容是模板参数类型,否则是 void 类型,代码如下:
template<typename T>
typename std::enable_if<std::is_integral<T>::value>::type
function(T t){}

std::decay<> 用于推导给定类型的“蜕变”(Decay)后的类型。它可以去除类型的引用、顶层 const 修饰符和数组的特殊性,得到原始类型。以下是几种蜕变操作的返回结果,注释部分标出了实际操作的结果,代码如下:
typedef std::decay<int>::type A;         //int
typedef std::decay<int&>::type B;        //int
typedef std::decay<int&&>::type C;       //int
typedef std::decay<const int&>::type D;  //int
typedef std::decay<int[2]>::type E;      //int*
typedef std::decay<int(int)>::type F;    //int(*)(int)

std::remove_pointer<> 用于移除类型中的指针修饰,获取实际的类型数据,通常可以和 std::decay<> 配合起来使用。以下是几种经过 remove_pointer<> 操作的返回结果,注释部分标出了实际操作的结果。
typedef std::remove_pointer<int>::type A;          //int
typedef std::remove_pointer<int * >::type B;         //int
typedef std::remove_pointer<int**>::type C;        //int*
typedef std::remove_pointer<const int * >::type D;   //const int
typedef std::remove_pointer<int * const>::type E;    //int
以上仅是 type_traits 中的一部分常用类和元函数,还有许多其他功能丰富的 traits 可用于编译期间的类型判断和处理。type_traits 的目的是使在编译期间可以更容易、更方便地进行类型特性的检查和条件编译,以提高代码的可读性和性能。

相关文章