返回指定类型的迭代器种类:
// xutility 757
template<class _Iter> inline
typename iterator_traits<_Iter>::iterator_category _Iter_cat(const _Iter&)
{ // return category from iterator argument
typename iterator_traits<_Iter>::iterator_category _Cat;
return (_Cat);
}
模板iterator_traits有一个普通版本和三种特化版本:
// 普通版本,通过_Iter自己定义的iterator_category来获取迭代器种类
template<class _Iter>
struct iterator_traits
{ // get traits from iterator _Iter
typedef typename _Iter::iterator_category iterator_category;
typedef typename _Iter::value_type value_type;
typedef typename _Iter::difference_type difference_type;
typedef typename _Iter::pointer pointer;
typedef typename _Iter::reference reference;
};
// 针对指针的特化
template<class _Ty>
struct iterator_traits<_Ty *>
{ // get traits from pointer
typedef random_access_iterator_tag iterator_category;
typedef _Ty value_type;
typedef ptrdiff_t difference_type;
typedef ptrdiff_t distance_type; // retained
typedef _Ty *pointer;
typedef _Ty& reference;
};
template<class _Ty>
struct iterator_traits<const _Ty *>
{ // get traits from const pointer
typedef random_access_iterator_tag iterator_category;
typedef _Ty value_type;
typedef ptrdiff_t difference_type;
typedef ptrdiff_t distance_type; // retained
typedef const _Ty *pointer;
typedef const _Ty& reference;
};
// 对所有的内置类型都有特化,在此略过。
template<> struct iterator_traits<_Bool>
{ // get traits from integer type
typedef _Int_iterator_tag iterator_category;
typedef _Bool value_type;
typedef _Bool difference_type;
typedef _Bool distance_type;
typedef _Bool * pointer;
typedef _Bool & reference;
};
template<> struct iterator_traits<float>
{
typedef _Float_iterator_tag iterator_category;
typedef float value_type;
typedef float difference_type;
typedef float distance_type;
typedef float * pointer;
typedef float& reference;
};
迭代器种类可能取值:
// vs 2005中迭代器种类有以下几种:
struct input_iterator_tag
{ // identifying tag for input iterators
};
struct output_iterator_tag
{ // identifying tag for output iterators
};
struct forward_iterator_tag
: public input_iterator_tag
{ // identifying tag for forward iterators
};
struct bidirectional_iterator_tag
: public forward_iterator_tag
{ // identifying tag for bidirectional iterators
};
struct random_access_iterator_tag
: public bidirectional_iterator_tag
{ // identifying tag for random-access iterators
};
// 前面几种是STL共有类型,而下面两种应该是VS 2005这种实现特有的
// 下面这两个类型使iterator_traits不仅能够获取迭代器特性,也能获取
// 系统内置数据类型的各种特性。
struct _Int_iterator_tag
{ // identifying tag for integer types, not an iterator
};
struct _Float_iterator_tag
{ // identifying tag for floating point types, not an iterator
};