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

来源:互联网 发布:交换机更换网络 编辑:程序博客网 时间:2024/04/30 05:01
解释说明

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_trivialtemplate <class _Tp> inline _Tp* __copy_aux2(_Tp* __first, _Tp* __last, _Tp* __result,                        __true_type) {  return __copy_trivial(__first, __last, __result);}


0 0
原创粉丝点击