为了使 traits 萃取顺利进行,STL 提供了一个 std::iterator
class 如下,如果每个新设计的迭代器都继承自它,就可保证符合 STL 所需的规范:
template <class Category
class T,
class Distance = ptrdiff_t,
class Pointer = T*,
class Reference = T&>
struct iterator {
typedef Category iterator_category;
typedef T value_type;
typedef Distance difference_type;
typedef Pointer pointer;
typedef Reference reference;
};
由于后三个参数都有默认值,故新的迭代器只需提供前两个参数即可。3.2 节的 ListIter 如果改用正式规格,应该这么写:
template <class Item>
struct ListItem :
public std::iterator<std::forward_iterator_tag, Item>
{...};
traits 编程技法大量运用于 STL 实现中。它利用“内嵌类型”的编程技巧与编译期模板参数推导的功能,增强 C++未能提供的关于类型认定方面的能力。