Trait所扮演的角色是特性萃取机的角色,萃取各个迭代器的特性,为了使trait特性有效运作,每一个迭代器必须遵循约定,自行以内嵌型别定义的方式定义出相应型别。根据编译器利用function template的参数推导机制,确定型别。(利用该机制解决参数返回值的型别定义)
template<class Category,class T , class Distance=ptrdiff_t,class Pointer=T*,class Reference=T&>
struct iterator{ //使用可以看后面的Vector
typedef Category iterator_ategory;
typedef T value_type;
typedef Distance difference_type;
typedef Pointer pointer;
typedef Reference reference;
};
template<class Iterator>
struct iterator_traits{ //萃取特性 定义结构方便使用
typedef typename Iterator:: iterator_ategory iterator_ategory;
typedef typename Iterator::value_type value_type;
typedef typename Iterator:: difference_type difference_type;
typedef typename Iterator:: pointer pointer;
typedef typename Iterator::reference reference;
};
typename 用意在于告诉编译器这是一个型别,因为在此之前编译器并不知道iterator<T>::value_type代表的是一个型别或者是member function或者是一个data member.
使用方法:
Iterator_traits<int>::value_type ......
由于并非是所有迭代器都是class type,原生指针就不是,就有偏特化版本引出
template<T>
struct iterator_traits<T*>{
typedef radom_access_iterator_tag iterator_ategory;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef const T* pointer;
typedef const T& reference;
};
template<T>
struct iterator_traits<T*>{
typedef radom_access_iterator_tag iterator_ategory;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference;
};
迭代器的五种分类:
Input Iterator,Output Iterator,Forward Iterator ,Bidirection Iterator,Random Access Iterator;