温习一下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源码剖析
相关文章推荐
- STL之traits技法
- STL中的Traits编程技法
- STL笔记(6)——Traits编程技法(一)
- STL中traits编程技法
- STL之traits编程技法
- STL之traits编程技法
- STL中的Traits编程技法
- STL学习笔记(四)——温习一下C++的一些重要概念(上)
- STL源码学习——迭代器(iterators)与traits编程技法
- STL itertor概念和traits编程技法(一)
- STL iterator和traits编程技法
- STL itertor概念和traits编程技法(二)
- STL源码分析读书笔记--第三章--迭代器(iterator)概念与traits编程技法
- 【深度探索STL】详解 traits 编程技法
- STL中迭代器概念与traits编程技法
- STL笔记(7)——Traits编程技法(二)
- STL(6)之Traits编程技法 与迭代器
- STL-traits编程技法
- STL中的traits编程技法
- STL源码-iterator traits编程技法(续)