定义了编译时常量的模板,这些常量可提供有关其类型参数的属性的信息或生成转换类型。
语法
#include <type_traits>
备注
type_traits 中的类和模板用于支持编译时的类型推理、分类和转换。<> 它们还用于检测与类型相关的错误,并帮助优化泛型代码。 一元类型特征描述类型属性,二元类型特征描述类型间关系,转换特征修改类型属性。
帮助程序类 integral_constant 及其模板专用化 true_type 和 false_type 构成类型谓词的基类。 类型谓词是采用一个或多个类型参数的模板。 如果类型谓词保留为 true,则它是以公共方式直接或间接从 true_type 派生的。 如果类型谓词保留为 false,则它是以公共方式直接或间接从 false_type 派生的。
类型修饰符或转换特征是一个模板,包含一个或多个参数以及一个成员 type(即修改后的类型)。
别名模板
为了简化类型特征表达式,提供了 typename some_trait<T>::type 的别名模板,其中 some_trait 是类模板名称。 例如,add_const 具有其类型 add_const_t 的别名模板,定义如下:
template <class T>
using add_const_t = typename add_const<T>::type;
这些是为 type 成员提供的的别名:
add_const_t
add_cv_t
add_lvalue_reference_t
add_pointer_t
add_rvalue_reference_t
add_volatile_t
aligned_storage_t
aligned_union_t
common_type_t
conditional_t
decay_t
enable_if_t
invoke_result_t
make_signed_t
make_unsigned_t
remove_all_extents_t
remove_const_t
remove_cv_t
remove_extent_t
remove_pointer_t
remove_reference_t
remove_volatile_t
result_of_t
underlying_type_t
类
帮助程序类和 typedef
| 名称 | 描述 |
|---|---|
| integral_constant | 从类型和值生成整型常量。 |
| true_type | 保留包含值 true 的整数常量。 |
| false_type | 保留包含值 false 的整数常量。 |
主要类型类别
| 名称 | 描述 |
|---|---|
| is_void | 测试类型是否为 void。 |
| is_null_pointer | 测试类型是否为 std::nullptr_t。 |
| is_integral | 测试类型是否为整型。 |
| is_floating_point | 测试类型是否为浮点。 |
| is_array | 测试类型是否为数组。 |
| is_pointer | 测试类型是否为指针。 |
| is_lvalue_reference | 测试类型是否是左值引用。 |
| is_rvalue_reference | 测试类型是否是右值引用。 |
| is_member_object_pointer | 测试类型是否为指向成员对象的指针。 |
| is_member_function_pointer | 测试类型是否为指向成员函数的指针。 |
| is_enum | 测试类型是否为枚举。 |
| is_union | 测试类型是否为联合。 |
| is_class | 测试类型是否为类。 |
| is_function | 测试类型是否为函数类型。 |
复合类型类别
| 名称 | 描述 |
|---|---|
| is_reference | 测试类型是否为引用。 |
| is_arithmetic | 测试类型是否为算术型。 |
| is_fundamental | 测试类型是否为 void 或算术型。 |
| is_object | 测试类型是否为对象类型。 |
| is_scalar | 测试类型是否为标量类型。 |
| is_compound | 测试类型是否为非标量类型。 |
| is_member_pointer | 测试类型是否为指向成员的指针。 |
Type 属性
| 名称 | 描述 |
|---|---|
| is_const | 测试类型是否为 const。 |
| is_volatile | 测试类型是否为 volatile。 |
| is_trivial | 测试类型是否常用。 |
| is_trivially_copyable | 测试类型是否可完全复制。 |
| is_standard_layout | 测试类型是否为标准布局类型。 |
| is_pod | 测试类型是否为 POD。 |
| is_literal_type | 测试类型是否可以是 constexpr 变量或是否可用于 constexpr 函数。 |
| is_empty | 测试类型是否为空类。 |
| is_polymorphic | 测试类型是否为多态类。 |
| is_abstract | 测试类型是否为抽象类。 |
| is_final | 测试类型是否是标记为 final 的类类型。 |
| is_aggregate | |
| is_signed | 测试类型是否为有符号的整数。 |
| is_unsigned | 测试类型是否为无符号的整数。 |
| is_constructible | 测试类型是否可使用指定参数类型进行构造。 |
| is_default_constructible | 测试类型是否包含默认构造函数。 |
| is_copy_constructible | 测试类型是否包含复制构造函数。 |
| is_move_constructible | 测试类型是否具有移动构造函数。 |
| is_assignable | 测试是否可以将第二个类型的值分配给第一个类型。 |
| is_copy_assignable | 测试是否可以将类型的常量引用值分配给该类型。 |
| is_move_assignable | 测试是否可以将类型的右值引用分配给该类型。 |
| is_swappable | |
| is_swappable_with | |
| is_destructible | 测试该类型是否易损坏。 |
| is_trivially_constructible | 测试在使用指定类型构造类型时,该类型是否未使用非常用操作。 |
| is_trivially_default_constructible | 测试在构造默认时,该类型是否未使用非常用操作。 |
| is_trivially_copy_constructible | 测试在构造复制时,该类型是否未使用非常用操作。 |
| is_trivially_move_constructible | 测试在构造移动时,该类型是否未使用非常用操作。 |
| is_trivially_assignable | 测试类型是否可赋值,以及赋值是否未使用非常用操作。 |
| is_trivially_copy_assignable | 测试类型是否为复制赋值,以及赋值是否未使用非常用操作。 |
| is_trivially_move_assignable | 测试类型是否为移动赋值,以及赋值是否未使用非常用操作。 |
| is_trivially_destructible | 测试类型是否易损坏,以及析构函数是否未使用非常用操作。 |
| is_nothrow_constructible | 测试类型是否可构造,以及是否确定在使用指定类型进行构造时不引发。 |
| is_nothrow_default_constructible | 测试类型是否是默认构造,以及是否确定在构造默认时不引发。 |
| is_nothrow_copy_constructible | 测试类型是否是复制构造,以及复制构造函数是否确定不引发。 |
| is_nothrow_move_constructible | 测试类型是否是移动构造,以及移动构造函数是否确定不引发。 |
| is_nothrow_assignable | 测试类型是否可使用指定类型进行赋值,以及赋值是否确定不引发。 |
| is_nothrow_copy_assignable | 测试类型是否是复制赋值,以及赋值是否确定不引发。 |
| is_nothrow_move_assignable | 测试类型是否是移动赋值,以及赋值是否确定不引发。 |
| is_nothrow_swappable | |
| is_nothrow_swappable_with | |
| is_nothrow_destructible | 测试类型是否易损坏,以及析构函数是否确定不引发。 |
has_virtual_destructor |
测试类型是否包含虚拟的析构函数。 |
has_unique_object_representations |
|
| is_invocable | 测试是否可以使用指定的参数类型调用可调用类型。 已在 C++17 中添加。 |
| is_invocable_r | 测试是否可以使用指定的参数类型调用可调用类型,以及结果是否可转换为指定类型。 已在 C++17 中添加。 |
| is_nothrow_invocable | 测试是否可以使用指定的参数类型调用可调用类型及其是否已知不会引发异常。 已在 C++17 中添加。 |
| is_nothrow_invocable_r | 测试是否可以使用指定的参数类型调用可调用类型及其是否已知不会引发异常,以及结果是否可转换为指定类型。 已在 C++17 中添加。 |
Type 属性查询
| 名称 | 描述 |
|---|---|
| alignment_of | 获取类型的对齐方式。 |
| rank | 获取数组维度数。 |
| extent | 获取指定数组维度中的元素数。 |
类型关系
| 名称 | 描述 |
|---|---|
| is_same | 确定两个类型是否相同。 |
| is_base_of | 测试一种类型是否是另一种类型的基类。 |
| is_convertible | 测试一种类型是否可转换为另一种类型。 |
Const-volatile 修改
| 名称 | 描述 |
|---|---|
| add_const | 从类型生成一个 const 类型。 |
| add_volatile | 从类型生成一个 volatile 类型。 |
| add_cv | 从类型生成一个 const volatile 类型。 |
| remove_const | 从类型生成一个非常量类型。 |
| remove_volatile | 从类型生成一个非易失类型。 |
| remove_cv | 从类型生成一个非常量非易失类型。 |
引用修改
| 名称 | 描述 |
|---|---|
| add_lvalue_reference | 从类型生成一个对类型的引用。 |
| add_rvalue_reference | 从类型生成一个对类型的右值引用 |
| remove_reference | 从类型生成一个非引用类型。 |
签名修改
| 名称 | 描述 |
|---|---|
| make_signed | 如果有符号,则生成该类型,或大小大于或等于类型的最小有符号类型。 |
| make_unsigned | 如果无符号,则生成该类型,或大小大于或等于类型的最小无符号类型。 |
数组修改
| 名称 | 描述 |
|---|---|
| remove_all_extents | 从数组类型生成一个非数组类型。 |
| remove_extent | 从数组类型生成一个元素类型。 |
指针修改
| 名称 | 描述 |
|---|---|
| add_pointer | 从类型生成指向类型的指针。 |
| remove_pointer | 从指向类型的指针生成一个类型。 |
其他转换
| 名称 | 描述 |
|---|---|
| aligned_storage | 为对齐类型分配未初始化的内存。 |
| aligned_union | 为具有不常用构造函数或析构函数的对齐联合分配未初始化的内存。 |
| common_type | 生成参数包的所有类型的通用类型。 |
| conditional | 如果条件为 true,则生成第一个指定类型,否则生成第二个指定类型。 |
| decay | 生成按值传递的类型。 设置非引用、非常量或非可变类型或者设置指向类型的指针。 |
| enable_if | 如果条件为 true,则生成指定类型,否则不生成类型。 |
| invoke_result | 确定可调用类型的返回类型,该可调用类型采用指定参数类型。 已在 C++17 中添加。 |
| result_of | 确定可调用类型的返回类型,该可调用类型采用指定参数类型。 在 C++14 中已添加,在 C++17 中已弃用。 |
| underlying_type | 生成枚举类型的基础整型类型。 |
逻辑运算符特征
| 名称 | 描述 |
|---|---|
| 连接 | |
| 析取 | |
| 求反 |