C++ Type Traits 类型特征

#类型修饰类

  • std::add_const_t<T>: 为类型 T 添加 const 修饰符。

  • std::add_volatile_t<T>: 为类型 T 添加 volatile 修饰符。

  • std::add_cv_t<T>: 为类型 T 添加 const 和 volatile 修饰符。

  • std::remove_const_t<T>: 移除类型 T 的 const 修饰符。

  • std::remove_volatile_t<T>: 移除类型 T 的 volatile 修饰符。

  • std::remove_cv_t<T>: 移除类型 T 的 const 和 volatile 修饰符。

  • std::add_lvalue_reference_t<T>: 为类型 T 添加左值引用修饰符。

  • std::add_rvalue_reference_t<T>: 为类型 T 添加右值引用修饰符。

  • std::remove_reference_t<T>: 移除类型 T 的引用修饰符。

  • std::remove_extent_t<T>: 移除类型 T 的数组维度。

  • std::remove_all_extents_t<T>: 移除类型 T 的所有数组维度。

  • std::remove_pointer_t<T>: 移除类型 T 的指针修饰符。

  • std::add_pointer_t<T>: 为类型 T 添加指针修饰符。

  • std::make_signed_t<T>: 将类型 T 转换为有符号类型。

  • std::make_unsigned_t<T>: 将类型 T 转换为无符号类型。

#类型推导类

  • std::enable_if_t<condition, T>: 如果 condition 为真,则展开为 T,否则模版替换失败。
  • std::conditional_t<condition, T, F>: 如果 condition 为真,则展开为 T,否则展开为 F
  • std::common_type_t<T, U>: 计算类型 TU 的公共类型。
  • std::underlying_type_t<T>: 获取类型 T 的底层类型。
  • std::result_of_t<T>: 获取类型 T 的结果类型。
  • std::invoke_result_t<T, Args...>: 获取类型 T 的调用结果类型。
  • std::invoke_result_t<T, Args...>: 获取类型 T 的调用结果类型。
  • std::decay_t

#类型判断类

  • std::is_const_v<T>: 检查给定的类型是否有const 修饰符。

  • std::is_volatile_v<T>: 检查给定的类型是否有 volatile 修饰符。

  • std::is_trivial_v<T>: 检查给定的类型是否是平凡类型。

  • std::is_pod_v<T>: 检查给定的类型是否是 POD 类型。

  • std::is_literal_type_v<T>: 检查给定的类型是否是字面类型。

  • std::is_aggregate_v<T>: 检查给定的类型是否是聚合类型。

  • std::is_trivially_copyable_v<T>: 检查给定的类型是否是可平凡复制的类型。

  • std::is_standard_layout_v<T>: 检查给定的类型是否是标准布局类型。

  • std::is_empty_v<T>: 检查给定的类型是否是空类型。

  • std::is_signed_v<T>: 检查给定的类型是否是有符号类型。

  • std::is_unsigned_v<T>: 检查给定的类型是否是无符号类型。

  • std::is_integral_v<T>: 检查给定的类型是否是整数类型。

  • std::is_floating_point_v<T>: 检查给定的类型是否是浮点类型。

  • std::is_arithmetic_v<T>: 检查给定的类型是否是算术类型。

  • std::is_array_v<T>: 检查给定的类型是否是数组类型。

  • std::is_pointer_v<T>: 检查给定的类型是否是指针类型。

  • std::is_reference_v<T>: 检查给定的类型是否是引用类型。

  • std::is_function_v<T>: 检查给定的类型是否是函数类型。

  • std::is_enum_v<T>: 检查给定的类型是否是枚举类型。

  • std::is_union_v<T>: 检查给定的类型是否是联合类型。

  • std::is_class_v<T>: 检查给定的类型是否是类类型。

  • std::is_polymorphic<T>: 检查给定的类型是否是多态类型。

  • std::is_final_v<T>: 检查给定的类型是否是最终类型。

  • std::is_abstract_v<T>: 检查给定的类型是否是抽象类型。

  • std::is_same_v<T, U>: 检查类型 TU 是否相同。

  • std::is_base_of_v<Base, Derived>: 检查类型 Derived 是否是类型 Base 的派生类。

  • std::is_convertible_v<From, To>: 检查类型 From 是否可以转换为类型 To

  • std::is_invocable_v<T, Args...>: 检查类型 T 是否可以被调用。

  • std::is_nothrow_invocable_v<T, Args...>: 检查类型 T 是否可以被调用,且不会抛出异常。

  • std::is_invocable_r_v<Ret, T, Args...>: 检查类型 T 是否可以被调用,且返回类型为 Ret

  • std::is_nothrow_invocable_r_v<Ret, T, Args...>: 检查类型 T 是否可以被调用,且返回类型为 Ret,且不会抛出异常。

#条件运算类

  • std::conjunction_v<...>: 检查所有给定的类型特征是否为真。
  • std::disjunction_v<...>: 检查至少一个给定的类型特征是否为真。
  • std::negation_v<...>: 检查给定的类型特征是否为假。