STL源码 萃取技术分析
2013-08-10 21:29
411 查看
第一遍读STL源码分析时,看的一头雾水,过段时间再读一遍,确实有了新的理解。首先还是看书本的迭代器原例子
(1)首先要明白的是迭代器是一种智能指针,智能指针的实现可参考auto_ptr。其次迭代器最重要的工作是对operator* 和operator->的调用,如上例中*iter,返回是指针指向对象的类型即value_type :int 类型。
(2)萃取过程:如果I自己有value_type,那么经过my_iterator_traits<I>::value_type value_type 萃取之后,这个value_type也即是I这个类型的value_type,再来看func函数调用过程,对于func函数的返回值:my_iterator_traits<I>::value_type
,其中I的类型为MyIter<int>,由模板实例化结果可知:value_type 实际是MyIter<int> 中的typedef int value_type,即返回值为int类型。
(3)不是所有的迭代器都是类类型的智能指针,然而原生指针天生就是一种迭代器,STL必须接受。对于原生指针 int* p = new int(200),对于上例调用func(p) ,int* 并没有value_type,所以结果出错,为了让结果*iter返回指向对象本身的类型,必须引入原生指针的特化版本,另外还应该对const int*进行特化。特化后代码如下:
对于萃取过程中,typedef typename I::value_type value_type是对迭代器中的value_type,而typedef typename I value_type则是针对原生指针,最后都是是为了得到指针解引用的返回类型。现在,不论我们面对的是迭代器myInter,还是原生指针int*,还是const int* 都是通过traits取得正确的value_type,即指针解引用的返回类型。
综述:对于类类型的迭代器,list<int> ::iterator,vector<int>::iterator还是int*,const int* 都可以让traits萃取其相应的类型value_type,different_type,pointer,reference,iterator_category等等类型。
#include<iostream> using namespace std; //自定义的迭代器 template<class T> struct MyIter{ typedef T value_type; T* ptr; MyIter(T* p= 0):ptr(p){} T& operator*()const{return *ptr;} }; //迭代器类型特征泛化版本 template<class I> struct my_iterator_traits{ typedef typename I::value_type value_type; }; /************************************************************************/ /* 使用typename my_iterator_traits<I>::value_type这种方式来确定返回值类型。 */ /************************************************************************/ template<class I> typename my_iterator_traits<I>::value_type func(I iter) { return *iter; } int main() { MyIter<int> iter = new int(520); // This time the following two statements will success cout<<func(iter)<<endl; return 0; }
(1)首先要明白的是迭代器是一种智能指针,智能指针的实现可参考auto_ptr。其次迭代器最重要的工作是对operator* 和operator->的调用,如上例中*iter,返回是指针指向对象的类型即value_type :int 类型。
(2)萃取过程:如果I自己有value_type,那么经过my_iterator_traits<I>::value_type value_type 萃取之后,这个value_type也即是I这个类型的value_type,再来看func函数调用过程,对于func函数的返回值:my_iterator_traits<I>::value_type
,其中I的类型为MyIter<int>,由模板实例化结果可知:value_type 实际是MyIter<int> 中的typedef int value_type,即返回值为int类型。
(3)不是所有的迭代器都是类类型的智能指针,然而原生指针天生就是一种迭代器,STL必须接受。对于原生指针 int* p = new int(200),对于上例调用func(p) ,int* 并没有value_type,所以结果出错,为了让结果*iter返回指向对象本身的类型,必须引入原生指针的特化版本,另外还应该对const int*进行特化。特化后代码如下:
#include<iostream> using namespace std; //自定义的迭代器 template<class T> struct MyIter{ typedef T value_type; T* ptr; MyIter(T* p= 0):ptr(p){} T& operator*()const{return *ptr;} }; //迭代器类型特征泛化版本 template<class I> struct my_iterator_traits{ typedef typename I::value_type value_type; }; /************************************************************************/ /* 由于int* ,float*,double*等等类型没有valueType,采用物化方式。 */ /************************************************************************/ //迭代器类型特征偏特化版本 //支持原生指针 template<class I> struct my_iterator_traits<I*>{ typedef I value_type; }; //迭代器类型特征偏特化版本 //支持point to const指针 template<class I> struct my_iterator_traits<const I*>{ typedef I value_type; }; //迭代器萃取器 /************************************************************************/ /* 使用typename my_iterator_traits<I>::value_type这种方式来确定返回值类型。 */ /************************************************************************/ template<class I> typename my_iterator_traits<I>::value_type func(I iter) { return *iter; } int main() { MyIter<int> iter = new int(520); MyIter<float> iter2 = new float(56.36); int *p = new int(520); // This time the following two statements will success cout<<func(iter)<<endl; cout<<func(p)<<endl; cout<<func(iter2)<<endl; return 0; }
对于萃取过程中,typedef typename I::value_type value_type是对迭代器中的value_type,而typedef typename I value_type则是针对原生指针,最后都是是为了得到指针解引用的返回类型。现在,不论我们面对的是迭代器myInter,还是原生指针int*,还是const int* 都是通过traits取得正确的value_type,即指针解引用的返回类型。
综述:对于类类型的迭代器,list<int> ::iterator,vector<int>::iterator还是int*,const int* 都可以让traits萃取其相应的类型value_type,different_type,pointer,reference,iterator_category等等类型。
相关文章推荐
- STL源码分析--萃取编程(traits)技术的实现
- STL源码(1)迭代器原理与萃取技术
- STL源码分析《4》----Traits技术
- STL源码分析《4》----Traits技术
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- Javascript笔记:(实践篇)从jQuery插件技术说起-分析extend方法的源码(发现extend方法里有bug)(下篇)
- string源码分析 ——转载 http://blogs.360.cn/360cloud/2012/11/26/linux-gcc-stl-string-in-depth/
- STL学习_SGI空间配置器_第一级配置器源码分析
- Muduo 网络库源码分析 之 关键技术点总结
- stl源码分析之vector
- Google Test(GTest)使用方法和源码解析——模板类测试技术分析和应用
- stl--分析空间配置器及源码实现
- STL的内存池的设计源码分析和体会
- [STL]源码分析:allocator
- STL源码分析—空间配置器
- stl源码分析之allocator
- STL源码分析之大顶堆
- STL源码分析读书笔记--第二章--空间配置器(allocator)
- STL源码分析----神奇的 list 的 sort 算法实现
- 技术积累BCM-SDK架构分析及源码移植-nios2平台移植