关于 iter_swap的实现
std::__are_same的实现:cpp_type_traits.h
很精巧简易,对于相同的类型,则匹配到第2个模板。这个__value值则可以用于判断2个类型是否是同一个类型
- template<typename, typename>
- struct __are_same
- {
- enum { __value = 0 };
- typedef __false_type __type;
- };
- template<typename _Tp>
- struct __are_same<_Tp, _Tp>
- {
- enum { __value = 1 };
- typedef __true_type __type;
- };
std::iterator_traits的实现:基本实现在stl_iterator_base_types.h
专门针对 Tp* 类型的指针实现了 特例化的 iterator_traits版本
对于其他的类型 则根据iterator其自身的traits定义了其相关特性
如果 _Iterator 不是某个容器的iterator则肯定会报编译错误(其traits不存在)
- template<typename _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;
- };
以下是 _Tp*和const _Tp*的特例化版本
- template<typename _Tp>
- struct iterator_traits<_Tp*>
- {
- typedef random_access_iterator_tag iterator_category;
- typedef _Tp value_type;
- typedef ptrdiff_t difference_type;
- typedef _Tp* pointer;
- typedef _Tp& reference;
- };
- template<typename _Tp>
- struct iterator_traits<const _Tp*>
- {
- typedef random_access_iterator_tag iterator_category;
- typedef _Tp value_type;
- typedef ptrdiff_t difference_type;
- typedef const _Tp* pointer;
- typedef const _Tp& reference;
GCC 4.2中的STL的iter_swap的实现
- template<typename _ForwardIterator1, typename _ForwardIterator2>
- inline void
- iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
- {
- //根据iterator_traits获取到value_type
- typedef typename iterator_traits<_ForwardIterator1>::value_type _ValueType1;
- typedef typename iterator_traits<_ForwardIterator2>::value_type _ValueType2;
- //concept检查
- __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIterator1>)
- __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIterator2>)
- __glibcxx_function_requires(_ConvertibleConcept<_ValueType1,_ValueType2>)
- __glibcxx_function_requires(_ConvertibleConcept<_ValueType2,_ValueType1>)
- //根据iterator_trait获取引用类型
- typedef typename iterator_traits<_ForwardIterator1>::reference _ReferenceType1;
- typedef typename iterator_traits<_ForwardIterator2>::reference _ReferenceType2;
- //判断值类型相等 和 引用类型和值类型的引用类型相等
- //全部相等则采用__iter_swap<true>::iter_swap(a,b) 的特例化版本(快速版)
- std::__iter_swap<__are_same<_ValueType1, _ValueType2>::__value &&
- __are_same<_ValueType1 &, _ReferenceType1>::__value &&
- __are_same<_ValueType2 &, _ReferenceType2>::__value>::
- iter_swap(__a, __b);
- }
std::swap 的通用版本
- template<typename _Tp>
- inline void
- swap(_Tp& __a, _Tp& __b)
- {
- // concept requirements
- __glibcxx_function_requires(_SGIAssignableConcept<_Tp>)
- _Tp __tmp = __a;
- __a = __b;
- __b = __tmp;
- }
__iter_swap模板,根据模板元参数true,false决定采用不同的swap方法
- template<bool _BoolType>
- struct __iter_swap
- {
- template<typename _ForwardIterator1, typename _ForwardIterator2>
- static void
- iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
- {
- typedef typename iterator_traits<_ForwardIterator1>::value_type
- _ValueType1;
- _ValueType1 __tmp = *__a;
- *__a = *__b;
- *__b = __tmp;
- }
- };
特例化true的版本调用快速的swap方法,不同的iterator的实现会特例化不同版本的swap函数,
如果没有特例化的版本,则采用上面的那个通用版本swap
- template<>
- struct __iter_swap<true>
- {
- template<typename _ForwardIterator1, typename _ForwardIterator2>
- static void
- iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
- {
- swap(*__a, *__b);
- }
- };