C++ type_traits类型萃取的用法(附带实例)
在 type_traits 头文件中包含了许多模板类和函数,用于在编译期间进行类型特性的推导和查询。type_traits 提供了编译时的类型信息,可以在编译期间根据类型的特点进行条件编译和模板特化。
以下是 C++11 中常用的 type_traits 类(或者称为元函数)和函数的一些介绍,代码如下:
std::enable_if<>:根据类型的条件判断启用某个函数模板。如果条件满足,则返回的内容是模板参数类型,否则是 void 类型,代码如下:
std::decay<> 用于推导给定类型的“蜕变”(Decay)后的类型。它可以去除类型的引用、顶层 const 修饰符和数组的特殊性,得到原始类型。以下是几种蜕变操作的返回结果,注释部分标出了实际操作的结果,代码如下:
std::remove_pointer<> 用于移除类型中的指针修饰,获取实际的类型数据,通常可以和 std::decay<> 配合起来使用。以下是几种经过 remove_pointer<> 操作的返回结果,注释部分标出了实际操作的结果。
以下是 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 的目的是使在编译期间可以更容易、更方便地进行类型特性的检查和条件编译,以提高代码的可读性和性能。