STL源码剖析——Traits编程技术
来源:互联网 发布:赶集游源码资源网 编辑:程序博客网 时间:2024/05/29 18:33
前言
在STL编程中,容器和算法是独立设计的,即数据结构和算法是独立设计的,连接容器和算法的桥梁就是迭代器了,迭代器使其独立设计成为可能。Traits编程技术是STL中最重要的编程技术,Traits可以获取一个类型的相关信息。在学习《STL源码剖析》时,看到关于这方面的知识,在这期间查找了一些资料,下面是我对该技术的理解。
Traits编程技术
Traits可以获取一个类型的相关信息,首先我们看下面的程序:
template <class T, class type>void function(T t, type u) { type temp; // ... The rest work of function…}在上面的程序中,我们怎么样才能获得已声明变量temp的类型type呢?在模板中,模板参数推导机制可以解决这个问题,在下面程序中编译器直到变量temp的类型为int:
template <class T, class type>void function(T iter, type u) { type temp; // 通过模板参数推导获得temp变量的类型 ....}template <class T>void func(T iter) { function(iter, *iter); }int main(){int i = 12;func(&i)}上面介绍的是获得局部变量的类型,这个可以通过模板参数推导机制完成;如果我们要获得函数返回值的类型时,该怎么处理呢?这个问题针对不同类型有不同的方法可以解决,类型型别:用户自定义类型(如结构体,类)和内置类型(如整型,原生指针等)。
若我们要知道用户自定义类型的函数返回值类型,我们可以使用内嵌型别技术就可以知道返回值的类型;看下面程序:
templates <class T>struct Iterator {typedef T value_type;//内嵌型别声明...};template <class Iterator>typename Iterator::value_type //返回值类型GetValue(Iterator iter) {return *iter;}int main(){...Iterator<int> ite(new int(9));std::cout<<GetValue(ite)<<std::endl;return 0;}在用户自定义类型中我们可以通过内嵌型别获得返回值的类型,若不是用户自定义的类型,而是内置类型时,例如是原生指针,这时候该怎么处理呢?因为原生指针不能内嵌型别声明,所以内嵌型别在这里不适用。于是Traits技术就出现了。以下利用Traits技术也可以获取用户自定义类型的返回值类型。
template <class Iterator>struct iterator_traits { typedef typename Iterator::value_type value_type; ...};template <class Iterator>typename iterator_traits<Iterator>::value_type //返回值类型GetValue(Iterator iter) {return *iter;}以上这种方法对原生指针不可行,所以iterator_traits针对原生指针的一个版本就应运而生。下面是针对*Tp和const *Tp的版本,也称为iterator_traits版本的偏特化。iterator_traits的偏特化版本解决了原生指针的问题。现在不管迭代器是自定义类模板, 还是原生指针(Tp*, const Tp*),struct iterator_traits都能萃取出正确的value type类型。
template <class Tp>struct iterator_traits<Tp*> { typedef Tp value_type; ...};template <class Tp>struct iterator_traits<const Tp*> { typedef Tp value_type; ...};
我们之所以要萃取(Traits)迭代器相关的类型,就是要把迭代器相关的类型用于声明局部变量、用作函数的返回值等一系列行为。对于原生指针和point-to-const类型的指针,采用模板偏特化技术对其进行特殊处理。要使用Traits功能,则必须自行以内嵌型别定义的方式定义出相应型别。我们上面讲解的只是迭代器其中一种类型value type,在迭代器中还有其他类型:
template <class _Iterator>struct iterator_traits { typedef typename _Iterator::iterator_category iterator_category; //迭代器类型 typedef typename _Iterator::value_type value_type;//迭代器所指对象的类型 typedef typename _Iterator::difference_type difference_type;//迭代器之间距离 typedef typename _Iterator::pointer pointer;//迭代器所指之物 typedef typename _Iterator::reference reference; //迭代器引用之物};参考文献:
【1】,【2】,【3】,【4】
0 0
- STL源码剖析——Traits编程技术
- STL源码剖析——Traits编程技术
- STL源码剖析——type traits编程技法
- STL源码剖析—迭代器与traits编程方法
- 《STL源码剖析》学习之traits编程
- stl源码剖析之traits编程技法
- STL源码剖析之traits编程技巧
- 《STL源码剖析》——迭代器(iterators)概念与traits编程技法(一)
- 《STL源码剖析》——迭代器(iterators)概念与traits编程技法(二)
- STL源码剖析之 traits 技术小结【2013.12.12】
- 《STL源码剖析》学习--traits
- 《STL源码剖析》traits技法
- 《STL源码剖析》之traits
- STL源码剖析-迭代器概念与traits编程技法
- STL源码解析——traits(特性)编程技巧
- STL源码分析--萃取编程(traits)技术的实现
- STL源码剖析中 traits的使用
- 《STL源码剖析》迭代器以及Traits设计
- cocos2d-x 3.2 |优化提示与技巧
- 学习VTK之路——基础篇(1)
- android 线程池(一)
- SQL点滴35—SQL语句中的exists
- 获取文件的版本信息和修改时间
- STL源码剖析——Traits编程技术
- 头盔式3D面部表情捕捉设备的介绍-made by China
- linux上很方便的上传下载文件工具rz和sz
- 为什么在12306买火车票要装根证书?
- 重构技巧二:解说css3 实现加载小动画。
- 进程间通信_01概述
- Android开发规范
- 树的遍历
- Vector、ArrayList和List的异同