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
- stl源码剖析学习笔记(二)traits编程技法简明例程
- STL学习笔记(traits编程技法)
- stl源码剖析之traits编程技法
- 《STL源码剖析》——迭代器(iterators)概念与traits编程技法(二)
- 《STL源码剖析》traits技法
- STL源码剖析(二) - 迭代器与traits技法
- STL源码剖析-迭代器概念与traits编程技法
- STL源码剖析——type traits编程技法
- STL源码剖析笔记四--迭代器与traits技法
- 《STL源码剖析》traits技法分析
- 《STL源码剖析》——迭代器(iterators)概念与traits编程技法(一)
- 《STL源码剖析》学习之traits编程
- SGI STL学习笔记(2):traits编程技法
- STL源码-iterator traits编程技法
- STL源码-iterator traits编程技法(续)
- STL源码-iterator traits编程技法
- STL源码-iterator traits编程技法(续)
- STL itertor概念和traits编程技法(二)
- android-studio gradle相关知识
- Cordova + Ionic + AngularJS
- Eclipse 替换jar出现ClassNotFound问题
- JavaScript生成八位随机数(含数字、字母、特殊符号)
- ajax回调函数 返回404
- stl源码剖析学习笔记(二)traits编程技法简明例程
- 企业如何降低代码泄露的风险?
- android中SELINUX规则分析和语法简介
- HTML网页超链接title赋一个变量
- 关于Android Studio打包混淆以及上传mapping文件
- xml中出现The processing instruction target matching "[xX][mM][lL]" is not allowed.
- C++ Set常用用法
- CentOS7.1 KVM虚拟化之虚拟机克隆(4)
- Java中类与方法的学习笔记(一):