C++模板元编程记录1

关于 iter_swap的实现
 
std::__are_same的实现:cpp_type_traits.h
很精巧简易,对于相同的类型,则匹配到第2个模板。这个__value值则可以用于判断2个类型是否是同一个类型
  1.  template<typenametypename>
  2.    struct __are_same
  3.    {
  4.      enum { __value = 0 };
  5.      typedef __false_type __type;
  6.    };
  7.  template<typename _Tp>
  8.    struct __are_same<_Tp, _Tp>
  9.    {
  10.      enum { __value = 1 };
  11.      typedef __true_type __type;
  12.    };

 
std::iterator_traits的实现:基本实现在stl_iterator_base_types.h
专门针对 Tp* 类型的指针实现了 特例化的 iterator_traits版本
对于其他的类型 则根据iterator其自身的traits定义了其相关特性
如果 _Iterator 不是某个容器的iterator则肯定会报编译错误(其traits不存在)
  1.   template<typename _Iterator>
  2.    struct iterator_traits
  3.    {
  4.      typedef typename _Iterator::iterator_category iterator_category;
  5.      typedef typename _Iterator::value_type        value_type;
  6.      typedef typename _Iterator::difference_type   difference_type;
  7.      typedef typename _Iterator::pointer           pointer;
  8.      typedef typename _Iterator::reference         reference;
  9.    };
  10.  

 
以下是 _Tp*和const _Tp*的特例化版本
  1.  template<typename _Tp>
  2.    struct iterator_traits<_Tp*>
  3.    {
  4.      typedef random_access_iterator_tag iterator_category;
  5.      typedef _Tp                         value_type;
  6.      typedef ptrdiff_t                   difference_type;
  7.      typedef _Tp*                        pointer;
  8.      typedef _Tp&                        reference;
  9.    };
  10.  
  11.  template<typename _Tp>
  12.    struct iterator_traits<const _Tp*>
  13.    {
  14.      typedef random_access_iterator_tag iterator_category;
  15.      typedef _Tp                         value_type;
  16.      typedef ptrdiff_t                   difference_type;
  17.      typedef const _Tp*                  pointer;
  18.      typedef const _Tp&                  reference;

 
 
GCC 4.2中的STL的iter_swap的实现
  1.   template<typename _ForwardIterator1, typename _ForwardIterator2>
  2.    inline void
  3.    iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
  4.    {
  5.      //根据iterator_traits获取到value_type
  6.      typedef typename iterator_traits<_ForwardIterator1>::value_type _ValueType1;
  7.      typedef typename iterator_traits<_ForwardIterator2>::value_type _ValueType2;
  8.  
  9.      //concept检查
  10.      __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIterator1>)
  11.      __glibcxx_function_requires(_Mutable_ForwardIteratorConcept<_ForwardIterator2>)
  12.      __glibcxx_function_requires(_ConvertibleConcept<_ValueType1,_ValueType2>)
  13.      __glibcxx_function_requires(_ConvertibleConcept<_ValueType2,_ValueType1>)
  14.      
  15.      //根据iterator_trait获取引用类型
  16.      typedef typename iterator_traits<_ForwardIterator1>::reference _ReferenceType1;
  17.      typedef typename iterator_traits<_ForwardIterator2>::reference _ReferenceType2;
  18.      //判断值类型相等 和 引用类型和值类型的引用类型相等
  19.      //全部相等则采用__iter_swap<true>::iter_swap(a,b) 的特例化版本(快速版)
  20.      std::__iter_swap<__are_same<_ValueType1, _ValueType2>::__value &&
  21.          __are_same<_ValueType1 &, _ReferenceType1>::__value &&
  22.          __are_same<_ValueType2 &, _ReferenceType2>::__value>::
  23.         iter_swap(__a, __b);
  24.    }
  25.  

std::swap 的通用版本
  1.   template<typename _Tp>
  2.    inline void
  3.    swap(_Tp& __a, _Tp& __b)
  4.    {
  5.      // concept requirements
  6.      __glibcxx_function_requires(_SGIAssignableConcept<_Tp>)
  7.  
  8.      _Tp __tmp = __a;
  9.      __a = __b;
  10.      __b = __tmp;
  11.    }

 
__iter_swap模板,根据模板元参数true,false决定采用不同的swap方法
  1.  template<bool _BoolType>
  2.    struct __iter_swap
  3.    {
  4.      template<typename _ForwardIterator1, typename _ForwardIterator2>
  5.        static void
  6.        iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
  7.        {
  8.          typedef typename iterator_traits<_ForwardIterator1>::value_type
  9.            _ValueType1;
  10.          _ValueType1 __tmp = *__a;
  11.          *__a = *__b;
  12.          *__b = __tmp;
  13.        }
  14.    };

 
特例化true的版本调用快速的swap方法,不同的iterator的实现会特例化不同版本的swap函数,
如果没有特例化的版本,则采用上面的那个通用版本swap
  1.  template<>
  2.    struct __iter_swap<true>
  3.    {
  4.      template<typename _ForwardIterator1, typename _ForwardIterator2>
  5.        static void
  6.        iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
  7.        {
  8.          swap(*__a, *__b);
  9.        }
  10.    };

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值