當(dāng)算法傳入迭代器參數(shù)的時候,算法需要迭代器的一些類型數(shù)據(jù),所以萃取器就代替迭代器對算法做出響應(yīng)
template<typename _ForwardIterator>
inline void
rotate(_ForwardIterator __first,
_ForwardIterator __middle,
_ForwardIterator __last)
{
...
std::__rotate(__first,__middle,__last,
std::_iterator_category(_first));//__rotate,是內(nèi)部實(shí)現(xiàn)的函數(shù)
}
實(shí)際的調(diào)用需要知道迭代器的類型,所以算法需要迭代器萃取器做出回應(yīng),返回迭代器類型
template<typename _Iter>
inline typename iterator_traits<_Iter>::iterator_category
_iterator_category(const _Iter&)
{
return typename iterator_traits<_Iter>::iterator_category;
}
通過迭代器生成iterator_traits<iterator>,可以獲得迭代器五個associated types
//list 的迭代器 assoatied types
template<typename _Tp>
struct _List_iterator
{
typedef std::didirectional_iterator_tag iterator_category;
typedef _Tp value_type;
typedef _Tp* pointer;
typedef _Tp& reference;
typedef ptrdiff_t difference_type;
};
但是對于萃取器來說,若是連續(xù)空間存儲的容器,內(nèi)部的迭代器和普通類型的指針是相同的,所以萃取器對于傳入普通指針也需要相應(yīng)的轉(zhuǎn)換,但是不同的是迭代器是一種class,而普通指針只是一種普通指針,所以萃取器會使用到偏特化(partial specialization)
template<calss T>
struct iterator_traits
{
typedef typename T::value_type value_type;
typedef typename T::difference_type difference_type
typedef typename T:pointer pointer
typedef typename T::reference reference
typedef typename T::iterator_category iterator_category
};
template<class T>
struct iterator_traits<T*> //native pointer的偏特化
{
typedef T value_type;
typedef std::ptrdiff_t difference_type
typedef T* pointer
typedef T& reference
typedef std::random_access_iterator_tag iterator_category
};
template<class T>
struct iterator_traits<const T*> //const native pointer的偏特化
{
typedef T value_type;
typedef std::ptrdiff_t difference_type
typedef T* pointer
typedef T& reference
typedef std::random_access_iterator_tag iterator_category
};
此處const T *的value_type不是 const T,而是 T,是因?yàn)槲覀冃枰獀alue_type聲明變量,若是常量變量則無法賦值,所以必須使用非常量變量。
所以不管是迭代器還是普通指針,都可以通過萃取器獲得associated types,所以提供給算法的接口就是一致的(這也是范式編程的思想)。