标准类型特征

Version >= C++ 11

type_traits 头包含一组模板类和帮助程序,用于在编译时转换和检查类型的属性。

这些特征通常用于模板中以检查用户错误,支持通用编程并允许优化。

大多数类型特征用于检查类型是否符合某些标准。它们具有以下形式:

template <class T> struct is_foo;

如果模板类使用满足某些标准 foo 的类型进行实例化,则 is_foo<T> 继承自 std::integral_constant<bool,true>(aka std::true_type),否则它继承自 std::integral_constant<bool,false>(aka std::false_type)。这给了特征以下成员:

常量

static constexpr bool value

true 如果 T 符合标准 foofalse 否则

功能

operator bool

返回 value

Version => C++ 14

bool operator()

返回 value

类型

名称 定义
value_type bool
type std::integral_constant<bool,value>

然后可以将该性状用于诸如 static_assertstd::enable_if 的构建体中std::is_pointer 的一个例子:

template <typename T>
void i_require_a_pointer (T t) {
    static_assert(std::is_pointer<T>::value, "T must be a pointer type");
}

//Overload for when T is not a pointer type
template <typename T>
typename std::enable_if<!std::is_pointer<T>::value>::type
does_something_special_with_pointer (T t) {
    //Do something boring
}

//Overload for when T is a pointer type
template <typename T>
typename std::enable_if<std::is_pointer<T>::value>::type 
does_something_special_with_pointer (T t) {
    //Do something special
}

还有各种改变类型的特征,例如 std::add_pointerstd::underlying_type。这些特征通常暴露单个 type 成员类型,其中包含转换类型。例如,std::add_pointer<int>::typeint*