之前讲过traits,表示萃取机的意思。同迭代器一样,用typedef的形式回答算法对类型的提问。
1 旧版本源码
has_trivial_default_constructor:默认构造函数是不是不重要;
has_trivial_copy_constructor:拷贝构造函数是不是不重要;
has_trivial_assignment_operator:拷贝赋值函数是不是不重要;
has_trivial_destructor:析构函数是不是不重要。
POD表示很旧的很普遍的那种格式,如只有数据没有函数的struct。
其中type traits的默认回答都是__false_type,即不是不重要,也就是说都很重要。
但如果有的类型的这些回答并不是“很重要”,这里可以给出范围偏特化版本告知“这个类型的某几个并不重要”。如下例:
2 新版本type traits样例和测试
3 实现
3.1 is_void
先拿掉令人困惑的,对主体没影响的,如const、volatile,移除这两个关键字的函数即remove_cv。实现方式都是一个泛化,一个偏特化,其中特化版本就起到了去掉const和volatile的功能。
调用is_void时,进入helper函数,若是void偏特化版本,返回真,否则为假。
3.2 is_integral
同上,通过偏特化的方式看类型是否是整形。
3.3 is_class、is_union、is enum、is_pod
代码中未出现,而编译器有这个能力回答,故应该是在编译的时候进行回答。