温习一下stl的traits技法

//五种迭代器类型
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源码剖析

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值