第一次听说traits是在一次电话面试中,当时还没有听说过这个词。之后查过资料,但也不是十分明白,直到今天重新看了一下《STL源码剖析》,稍微有一些想法。
1. traits是模板编程里面的一个编程技法。可能因为不是面向对象的,所以算不上一种设计模式。虽然traits本身一般实现为模板(itrator_traites<T>,以及__type_traits<T>等),但和智能指针(auto_ptr<T>)这种比较大众的模板相比,traits的用法又有点宽泛,所以感觉说traits是一种编程技法是比较保险的。
2. traits是STL里面非常重要的概念,所以我觉得用STL来体会traits是有帮助的。而提起STL,其主要内容就是容器和算法,连接两者的的纽带就是迭代器。由于迭代器遇到了一些问题,于是需要traits这种技法的帮助。当然也可能是先有traits这种技法,然后才决定用迭代器以及容器和算法分离的方式来实现STL。
3. traits是“萃取”还是“特性”的意思?侯捷说是“特性萃取机”和“榨汁机”。我的理解是,通过偏特化的机制,把特性信息过滤出来——榨汁。比如下面的特化版本,分别把T*和const T*过滤出来T。从而解决了原生指针提取类型特征的问题。
template<class T>
struct iterator_traits<T*> {
typedef T value_type;
};
template<class T>
struct iterator_traits<const T*> {
typedef