虽然可以追溯到TR1及boost库中,Type Traits在C++11的标准库中才被C++语言正式引入的。直接地翻译,Type Traits就是“类型的特征”的意思。在C++元编程中,程序员不少时候都需要了解一些类型的特征信息,并根据这些类型信息选择应有的操作。
在《深入理解C++11》一书中,我们就常使用Type Traits来判断类型的特性。比如:
#include <type_traits>
template<typename T>
constexpr bool is_pod(T) {
return std::is_pod<T>::value;
}
这里就定义了一个名为is_pod的函数模板。该函数模板只是type_traits中模板类is_pod的简单包装。通过该函数,我们可以判断一个类型的数据是否为POD类型的:
int main(){
int a;
std::cout << is_pod(a) << std::endl;
}
值得注意的是,Type Traits是用于元编程中的元素,而且我们的函数表达式使用了constexpr进行修饰,那么这就意味着程序员可以在编译时期就获得is_pod返回的值。在本例中,我们获得的值为true(1),那么上面的main函数在运行时的代码将与:
int main(){
std::cout << 1 << std::endl;
}
等价。
在C++11标准(也是TR1)的提案中(N1424),语言设计者在<type_traits>头文件中定义了大量如上的Type Traits。下表摘自http://en.cppreference.com/w/cpp/types:
Primary type categories |
|
|
|
(C++11)
|
checks if a type is void |
|
|
(C++11)
|
checks if a type is integral type |