引用《STL源码剖析》的话说,traits是用来获取迭代器指向的数据类型。
1. 为迭代器增加内嵌数据类型
template<typename T>
class Iterator
{
public:
typedef T value_type;//内嵌类型声明
Iterator(T *p = 0) : m_ptr(p) {}
T& operator*() const { return *m_ptr;}
//...
private:
T *m_ptr;
};
2. 定义 Iterator_traits
template<typename Iterator>
struct iterator_traits
{
typedef typename Iterator::value_type value_type;
};
3. 使用Iterator_traits 获取迭代器指向的数据类型
template<typename Iterator>
typename Iterator::value_type //这行是返回类型
func(Iterator iter)
{
return *iter;
}
//通过iterator_traits作用后的版本
template<typename Iterator>
typename iterator_traits<Iterator>::value_type //这行是返回类型
func(Iterator iter)
{
return *iter;
}
4. Iterator_traits 偏特化
由于原生指针也是一种迭代器,但是raw pointer是没有内嵌类型的。所以对于raw pointer进行特殊处理,也就是偏特化。使得raw pointer也支持iterator_traits。
定义iterator_traits的原生指针偏特化版本。
//iterator_traits的偏特化版本,针对迭代器是个原生指针的情况
template<typename T>
struct iterator_traits<T*>
{
typedef T value_type;
};
template<typename T>
struct iterator_traits<const T*>
{
typedef T value_type;
}