A.6. 类型萃取

多年来,C++ 开发者开发出了各种技术,用于在编译时推理其类型的属性。推断诸如“类型 T 是 const 的吗?”或“类型 T 是否可以简单复制(trivially copyable)?”之类的问题在泛型代码中尤其有用。这些技术所生成的结构称为类型特性(type traits),许多在实践中广泛采用的类型特性(以及一些需要编译器支持才能实现的特性)已经标准化,并可以在头文件 <type_traits> 中找到。

标准类型特性的表现形式也随着时间的推移而趋于统一。早期的形式如 std::numeric_limits<T> 提供了大量与类型相关的服务,而后来则趋向于更具体的接口,例如 std::is_const<T>(类型 T 是否是 const?)或 std::remove_const<T>(请给出一个与 T 类似但不带 const 限定符的类型,如果有的话),这些特性通常返回一个类型或一个值。

实践表明,那些返回一个类型(命名为 type)或一个编译时常量值(命名为 value)的小型、单一用途的类型特性视为“最佳实践”。大多数现代的类型特性(包括标准中的)都是以这种方式编写的。

自 C++14 起,返回类型的类型特性引入了以 _t 结尾的别名(不再需要书写冗长的 typename std::remove_const<T>::type,现在可以直接写成 std::remove_const_t<T>);而自 C++17 起,返回值的类型特性也引入了以 _v 结尾的别名(可以用 std::is_const_v<T> 替代 std::is_const<T>::value)

概念呢?

类型特性(type traits)是一种在 C++ 中存在了几十年的编程技术。但自 C++20 起,引入了“概念”(concepts),概念在某种程度上类似于特性(通常通过特性来表达),但更加强大,它们是类型系统的一部分。本书中不会大量使用概念,但你(作为开发者)确实应该去了解。它们非常强大,并且对现代 C++ 编程极具实用价值。