stl源码剖析学习笔记(二)traits编程技法简明例程

解释说明

traits侯捷老师的翻译是萃取。其目的就是在编译期进行模板调用的类型识别,从而做一些事情。

最突出的例子,我觉得不是《STL源码剖析》中“迭代器概念与traits编程技法"这一章的说明,而是stl算法中copy的实现。代码在stl源码的stl_algobase.h中。

copy的最终实现,大致分为两类,一类是直接整块内存的memmove操作,另一类是一个个对象赋值。其中涉及has_trivial_assignment_operator的类型推断。

如果has_trivial_assignment_operator是__true_type,则进行memmove操作拷贝;如果不是,则一个个对象拷贝。

而基础类型均在type_traits.h中设置有typedef __true_type    has_trivial_assignment_operator;


【注】:所有的类型推导,都是在编译期完成的!!

本篇暂时忽略T、T*、const T*类型偏特化(Partial Specilization)的讨论。


摘抄部分代码如下:
// type_traits.h
__STL_TEMPLATE_NULL struct __type_traits<bool> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};

// stl_algobase.h

// trivial(平凡的)类型,直接拷贝
template <class _Tp>  
inline _Tp*
__copy_trivial(const _Tp* __first, const _Tp* __last, _Tp* __result) {
  memmove(__result, __first, sizeof(_Tp) * (__last - __first));
  return __result + (__last - __first);
}

// 复杂类型,一个个赋值
template <class _InputIter, class _OutputIter, class _Distance>   
inline _OutputIter __copy(_InputIter __first, _InputIter __last,
                          _OutputIter __result,
                          input_iterator_tag, _Distance*)
{
  for ( ; __first != __last; ++__result, ++__first)
    *__result = *__first;
  return __result;
}

// 通过判断has_trivial_assignment_operator是否是__true_type决定调用方式
template <class _InputIter, class _OutputIter, class _Tp> 
inline _OutputIter __copy_aux(_InputIter __first, _InputIter __last,
                              _OutputIter __result, _Tp*) {
  typedef typename __type_traits<_Tp>::has_trivial_assignment_operator
          _Trivial;
  return __copy_aux2(__first, __last, __result, _Trivial());
}

// __false_type ,使用__copy一个个拷贝
template <class _InputIter, class _OutputIter>  
inline _OutputIter __copy_aux2(_InputIter __first, _InputIter __last,
                               _OutputIter __result, __false_type) {
  return __copy(__first, __last, __result,
                __ITERATOR_CATEGORY(__first),
                __DISTANCE_TYPE(__first));
}

// __true_type,使用__copy_trivial
template <class _Tp> 
inline _Tp* __copy_aux2(_Tp* __first, _Tp* __last, _Tp* __result,
                        __true_type) {
  return __copy_trivial(__first, __last, __result);
}


已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:C马雯娟 返回首页