第一次听说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 T value_type;
};4. 在iterator中,traits除了解决value type的问题,还可以提取其他的4种类型信息:iterator category、difference type、pointer、reference。在__type_traits<T>

本文介绍了作者对C++ Traits编程技法的理解,包括其作为模板编程的一种技法,它在STL中的重要性,特别是如何在解决迭代器问题上发挥作用。通过特质类,可以萃取类型信息,例如从原生指针中提取类型。尽管网上有各种解释,但作者发现以STL迭代器为例更容易理解Traits,并希望通过记录自己的理解,以便后续验证。
最低0.47元/天 解锁文章
608

被折叠的 条评论
为什么被折叠?



