C++11新增类型萃取功能——type_traits模板类
文章目录c11新特性——type_traits类型萃取模板类1 类型萃取原理2 类型萃取的使用3 标准库提供的类型萃取模板3.1 类型和属性判断3.2 类型关系判断3.3 类型变换3.4 受支持的操作c11新特性——type_traits类型萃取模板类c11 引入了类型萃取允许程序在编译期间就能够获取类型的具体信息。1 类型萃取原理类型萃取使用了类模板的特化机制将需要判断的类型传入类模板并输出类模板的布尔成员 value 来展示判断结果以手写一个指针检测的类模板为例该类模板可以检测传入的类型是否是指针类型// 主模板返回 false templatetypename T struct check_pointer { // 如果匹配到主模版则返回 false表示类型不是指针 static constexpr bool value false; }; // 偏特化版本的模板 templatetypename T struct check_pointerT* { // 如果匹配到 T*则是指针返回 true表示类型是指针 static constexpr bool value true; }; // 为了匹配 const T *可以继续添加需要的偏特化版本的模板 templatetypename T struct check_pointerconst T* { // 如果匹配到 const T*则返回 true static constexpr bool value true; }; // 使用 cout check_pointerint::value endl; // 匹配到主模板value 为 false cout check_pointerint*::value endl; // 匹配到偏特化模板value 为 true cout check_pointerconst int*::value endl; // 匹配到偏特化模板value 为 true根据模板的特化机制符合条件的类型会匹配到具体的偏特化版本从而返回 true判定完成。上述的check_pointer只是用于原理展示的示例标准库中的指针检测模版是std::is_pointer。2 类型萃取的使用使用类型萃取可搭配static_assert静态断言使用在编译期进行类型判断#include type_traits using haha int; // haha 为 int 的别名 static_assert(std::is_integralhaha::value false, 必须为整型); // 使用断言防止非整型类型通过传入 haha 是 int 类型的别名断言通过不报错3 标准库提供的类型萃取模板3.1 类型和属性判断// 基础类型判断 is_voidvoid::value; // void 类型 is_null_pointnullptr::value; // nullptr 类型 is_integralint::value; // 整型 is_floating_pointfloat::value; // 浮点型 is_array::value // 数组类型 is_enum::value; // 枚举类型 is_union::value; // 联合体类型 is_class::value; // 非联合类类型 is_function::value; // 函数类型 is_pointerint*::value; // 指针判断 is_lvalue_reference::value; // 左值引用 is_rvalue_reference::value; // 右值引用 is_member_object_pointer::value; // 指向非静态成员对象的指针类型 is_member_function_pointer::value; // 指向非静态成员函数的指针类型 // 复合类型判断 is_fundamental::value; // 基础类型算术类型、void 或 nullptr_t is_arithmetic::value; // 算术类型整数类型、浮点类型 is_scalar::value; // 标量类型算术类型、枚举类型、指针类型、成员指针类型、nullptr_t is_object::value; // 对象类型除了函数、引用或 void 类型外的任何可有 cv 限定的类型 is_compound::value; // 复合类型数组、函数、对象指针、函数指针、成员对象指针、成员函数指针、引用、类、联合体或枚举 std::is_referenceint::value; // 是否引用左值引用、右值引用 std::is_member_pointer::value; // 指向非静态成员的指针类型函数、对象 // 属性判断 is_constconst int::value; // const 限定 is_volatile::value; // volatile 限定 is_literal_type::value; // 字面类型 is_empty::value; // 类但非联合体类型且无非静态数据成员 is_polymorphic::value; // 多态类类型声明或继承至少一个虚函数的非联合类类型 is_abstract::value; // 抽象类类型声明或继承至少一个纯虚函数的非联合类类型 is_final::value; // final 类类型 is_signed::value; // 有符号算术类型 is_unsigned::value; // 无符号算术类型nullptr_t是空指针字面量nullptr的类型。3.2 类型关系判断// 类型关系 is_same::value; // 检查两个类型是否相同 is_base_of::value; // 检查一个类型是否为另一个类型的基类 is_virtual_base_of::value; // 检查一个类型是否为另一个类型的虚基类 is_convertible::value; // 检查是否能转换一个类型为另一类型3.3 类型变换// 类型变换 remove_cv::value; // 给定类型移除 const 和 volatile 限定符 remove_const::value; // 给定类型移除 const 限定符 remove_volatile::value; // 从给定类型移除 volatile 限定符 add_cv::value; // 向给定类型添加 const 和 volatile 限定符 add_const::value; // 向给定类型添加 const 限定符 add_volatile::value; // 向给定类型添加 volatile 限定符 remove_reference::value; // 从给定类型移除引用 add_lvalue_reference::value; // 向给定类型添加左值 引用 add_rvalue_reference::value; // 向给定类型添加右值 引用 //...3.4 受支持的操作// 受支持的操作 is_default_constructible::value; // 是否有默认构造函数 is_constructible::value; // 是否有针对特定实参的构造函数 is_copy_constructible::value; // 是否有拷贝构造函数 is_move_constructible::value; // 是否有右值引用构造函数移动构造函数 is_copy_assignable::value; // 是否有复制赋值运算符 is_move_assignable::value; // 是否有移动赋值运算符 //...