STL源码剖析之traits编程技巧
来源:互联网 发布:桂林绿源网络 编辑:程序博客网 时间:2024/05/22 17:44
一、traits编程技巧
在迭代器中,不同数据结构都有其专属的迭代器,不同的迭代器具有不同属性,算法根据迭代器的不同属性自动的选择执行,这其中技术由traits编程技术完成的,它是通过“内嵌类型”与C++template参数推导功能,解决C++类型识别问题。
迭代器所指向对象的型别成为迭代器的value_type。
//内嵌型别处理template<typename T>class Iterator{public:typedef T value_type;//内嵌型别T* m_ptr;Iterator(T *p = 0):m_ptr(p){}~Iterator(){}}//template参数推导template<typename Iterator> typename Iterator::value_type //编译期间不知道value_type类型,typename用来指定这是个类型 func(Iterator iter) { return *iter; }由于并不是所有迭代器都是class类型,如原生指针,不是class类型的就无法使用内嵌类型,要解决此问题就要引入偏特化的概念。
二、Partial Specialization偏特化
如果一个class template拥有一个以上的template的参数,则可以就其中的参数进行偏特化处理。《泛型思想 》对偏特化的定义如下:针对(任何)template参数进行跟进一步的条件限制所设计出来的特化版本。
//这个泛型版本允许T为任何类型 template<typename T> class C { }; //偏特化版本限制了T为原生指针的类型template<typename T> class C<T*> { };有了偏特化的处理,我们还需要迭代器萃取机iterator_traits来进行“萃取”迭代器的特性。
三、迭代器萃取机
template<typename Iterator> struct iterator_traits //如果Iterator有定义value_type,那么经过萃取之后的value_type就为Iterator的value_type{ typedef typename Iterator::value_type value_type; };原生指针的偏特化解决:
template<typename T> struct iterator_traits<T*> { typedef T value_type; };
四、迭代器萃取机定义的类型
tempalte<typename I> struct iterator_traits { typedef typename I::iterator_category iterator_category; typedef typename I::value_type value_type; typedef typeanme I:difference_type difference_type; typedef typename I::pointer pointer; typedef typename I::reference reference; };(1)value_type为迭代器所指对象的类别;
(2)different_type用来表示两个迭代器之间的距离。例如STL中count()返回值就是different_type.
(3)reference为迭代器所指对象的引用。
(4)pointer即为迭代器所指对象。
(5)iterator_category用来表示迭代器移动特性和对迭代器可执行操作。
五、完整的定义
template<typename Category, typename T, typename Distance = ptrdiff_t, typename Pointer = T*, typename Reference = T&> struct iterator { typedef Category iterator_category; typedef T value_type; typedef Distance difference_type; typedef Pointer pointer; typedef Reference reference; };
0 0
- STL源码剖析之traits编程技巧
- 《STL源码剖析》学习之traits编程
- stl源码剖析之traits编程技法
- 《STL源码剖析》之traits
- STl-traits编程技巧
- 《STL源码剖析》学习--traits
- 《STL源码剖析》traits技法
- 《STL源码剖析》学习笔记系列之三-------迭代器和traits编程
- STL源码剖析——Traits编程技术
- STL源码剖析—迭代器与traits编程方法
- STL源码剖析——Traits编程技术
- STL源码剖析-迭代器概念与traits编程技法
- STL源码剖析——type traits编程技法
- STL源码剖析之 traits 技术小结【2013.12.12】
- STL源码解析——traits(特性)编程技巧
- STL中的traits编程技巧
- STL中的Traits编程技巧
- STL源码剖析中 traits的使用
- PAT甲级1061. Dating (20)
- JS立即执行函数
- 团体程序设计天梯赛L2-009 抢红包
- 第七届蓝桥杯 省赛 JavaB组 凑算式
- iOS进阶1--UIWebView缓存
- STL源码剖析之traits编程技巧
- POJ 3279 Fliptile (反转)
- oracle--sql--倒叙和正序同时存在情况归纳
- 第二章 线性表
- 九度OJ 题目1054:字符串内排序
- 修改vim主题配色
- Android Sqlite库基本操作
- U3D插件 Build Report Tool 自述文件
- Android线程同步