<type_traits>

定义了编译时常量的模板,这些常量可提供有关其类型参数的属性的信息或生成转换类型。

语法

#include <type_traits>

备注

type_traits 中的类和模板用于支持编译时的类型推理、分类和转换。<> 它们还用于检测与类型相关的错误,并帮助优化泛型代码。 一元类型特征描述类型属性,二元类型特征描述类型间关系,转换特征修改类型属性。

帮助程序类 integral_constant 及其模板专用化 true_typefalse_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 生成枚举类型的基础整型类型。

逻辑运算符特征

名称 描述
连接
析取
求反

另请参阅

<functional>