學習模板trait

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{};


template<class Category,class T,class Distance=ptrdiff_t,
	class Pointer=T*,class Reference=T&>
	struct iterator{
		typedef Category iterator_category;
		typedef T 		 value_type;
		typedef Distance difference_type;
		typedef Pointer pointer;
		typedef Reference reference;
	};

	template <class Iterator>
	struct iterator_traits{
		typedef typename Iterator::iterator_category iterator_category;
		typedef typename Iterator::value_type value_type;
		typedef typename Iterator::difference_type difference_type;
		typedef typename Iterator::pointer pointer;
		typedef typename Iterator::reference reference;
	};

	template <class T>
	struct iterator_traits<T*>{
		typedef random_access_iterator_tag 	iterator_category;
		typedef T 							value_type;
		typedef ptrdiff_t 					difference_type;
		typedef T*							pointer;
		typedef T&							reference;
	};

	template <class T>
	struct iterator_traits<const T*>{
		typedef random_access_iterator_tag 	iterator_category;
		typedef T 							value_type;
		typedef ptrdiff_t 					difference_type;
		typedef const T*					pointer;
		typedef const T&					reference;
	};


	template <class Iterator>
	inine typename iterator_traits<Iterator>::iterator_category
	iteratorCategory(const Iterator&)
	{
		typedef typename iterator_traits<Iterator>::iterator_category category;
		return category();
	}

	template<class InputIterator,class Distance>
	inline void __advance(InputIterator& i,Distance n,input_iterator_tag){
		while(n--)++i;
	}

	template<class BidirectionalIterator,class Distance>
	inline void __advance(BidirectionalIterator& i,Distance n,bidirectional_iterator_tag){
		if(n>=0)
			while(n--)++i;
		else
			while(n++)--i;
	}

	template <class RandomAccessIterator,class Distance>
	inline void __advance(RandomAccessIterator& i,Distance n,random_access_iterator_tag){
		i += n;
	}

	template<class InputIterator,class Distance>
	inline void advance(InputIterator& i,Distance n){
		__advance(i,n,iteratorCategory(i));
	}

發佈了23 篇原創文章 · 獲贊 25 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章