您的位置:首页 > 大数据 > 人工智能

温习一下stl的traits技法

2015-03-05 15:18 260 查看
//五种迭代器类型
struct input_iterator_tag{};
struct output_iterator_tag{};
struct forward_iterator_tag:public input_iterator_tag{};
struct bidirectional_iterator_tag:public forward_iterator_tag{};
struct random_Access_Iterator_tag:public bidirectional_iterator_tag{};

//迭代器基类std:iterator,原生指针不需要用户定义
template<class Category, class T, class Distance = ptrdiff_t, class Pointer = T*, class Reference = T&>
class interator
{
typedef Category	iterator_category;
typedef T			value_type;
typedef Distance	diferrence_type;
typedef Pointer		pointer;
typedef Reference	reference;
};

//traits
template<class iterator>
struct iteretor_traits
{
typedef typename iterator::iterator_category  iterator_category;
typedef typename iterator::value_type  value_type;
typedef typename iterator::diferrence_type  diferrence_type;
typedef typename iterator::pointer  pointer;
typedef typename iterator::reference  reference;
};

//原生指针的traits偏特化版本
template<class T>
struct iteretor_traits<T*>
{
typedef random_Access_Iterator_tag  iterator_category;
typedef T  value_type;
typedef ptrdiff_t  diferrence_type;
typedef T*  pointer;
typedef T&  reference;
};

//const原生指针的traits偏特化版本
template<class T>
struct iteretor_traits<const T*>
{
typedef random_Access_Iterator_tag  iterator_category;
typedef T  value_type;
typedef ptrdiff_t  diferrence_type;
typedef const T*  pointer;
typedef const T&  reference;
};

//获取迭代器类型
template<class iterator>
inline typename iteretor_traits<iterator>::iterator_category
iterator_category(const iterator&){
typedef typename iteretor_traits<iterator>::iterator_category category;
return category();}

//获取迭代器的distance type
template<class iterator>
inline typename iteretor_traits<iterator>::diferrence_type*
diferrence_type(const iterator&){
return static_cast<typename iteretor_traits<iterator>::diferrence_type*>(0);}

//获取迭代器的value_type
template<class iterator>
inline typename iteretor_traits<iterator>::value_type
diferrence_type(const iterator&){
return static_cast<typename iteretor_traits<iterator>::value_type>(0);}

//distance函数
template<class InputIterator>
inline typename iteretor_traits<InputIterator>::diferrence_type
_distance(InputIterator first, InputIterator second, input_iterator_tag){
iteretor_traits<iterator>::diferrence_type n;
while(first != second) {++first; ++n;}
return n;
}

template<class RandomAccessIterator>
inline typename iteretor_traits<RandomAccessIterator>::diferrence_type
_distance(RandomAccessIterator first, RandomAccessIterator second, random_Access_Iterator_tag){
return second - first;
}

template<class InputIterator>
inline typename iteretor_traits<InputIterator>::diferrence_type
distance(InputIterator first, InputIterator second, input_iterator_tag){
return _distance(first, second, iterator_category(first);
}

//advance函数
template<class InputIterator, class distance>
inline void	_advance(InputIterator first, distance n, input_iterator_tag){
while(n--) ++first;
}

template<class BidirectionalIterator, class distance>
inline void	_advance(InputIterator first, distance n, bidirectional_iterator_tag){
if(n>0)
while(n--) ++first;
else
while(n++) --first;
}

template<class RandomAccessIterator, class distance>
inline void	_advance(RandomAccessIterator first, distance n, random_Access_Iterator_tag){
first += n;
}

template<class InputIterator>
inline void	distance(InputIterator first, distance n, input_iterator_tag){
return _advance(first, n, iterator_category(first));

摘自stl源码剖析
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: