在本书迭代器一节提到了Traits编程技法,将其誉为stl源码门匙,在《C++编程思想》一书中,将其列为模板编程中的习语“特征”,这里进行总结。

traits技术 也往往和迭代器一起使用。

1、理解概念

在《C++编程思想》一书中,特征模板技术,定义为一种将与某种类型相关联的所有声明绑定在一起的方法,可以以一种灵活的方法从语境中将类型和值进行“混合和匹配”,同时又使得代码灵活易读且易于维护。

在本书中,如果I定义有自己的value type,那么通过traits的作用,萃取出来的value_type就是I::value_type。意思即是通过在类内部定义value_type的值,就可以通过获取value_type来获取模板的类型。

如:

template <class I>
struct iterator_traits{typedef typename I::value_type value_type;
}

2、作用

多了一层间接性,带来什么好处呢?

那来看一下,如果不用traits怎么来获取value type,方法一可以使用template参数推导,但是推导机制推导的只是参数,不能是函数的返回值;方法二,采用内嵌类型,typedef I value_type,此时,如果T为一个原生指针或者其他非class type,就无法定义内嵌类型。所以,好处就很明显了。是traits可以拥有特化版本,这样就可以获取原生指针或者其他非class type的类型了。

如:

template <class I>
struct iterator_traits <I*> { //偏特化版--原生指针typedef I value_type;
}

另外,针对指向常数对象的指针,如果我们采用上面一个模板函数,得打的类型为const 之类,此时不能更改变量,也就失去了意思。所以针对指向const的指针型别也做一个特化。

template <class I>
struct iterator_traits <const I*> { //偏特化版--原生指针typedef  I value_type;
}

3、stl中的使用

在迭代器一节中很明显看出traits的作用。

迭代器所指对象的型别,成为该迭代器 的value type。最常用的的迭代器型别有五种:value type(所指对象型别)\ difference type(两个迭代器之间的距离)\ pointer(*)\ reference (&)\ iterator catagory(Input\Output\Forward\Bidirectional\Random五种)。

在迭代器里面必须要定义这五种相应型别才可以和stl很好的配合使用。

知道了迭代器的型别,为了提供某些算法的效率,针对不同的型别,可以利用型别对算法进行重载,以提高效率。

4、扩展使用

sgi把traits技法进一步扩大到迭代器以外,这里讲解了__type_traits,本书第二章析构时判断是不是trivial dtor时,就是采用了此种方法。

了解一个概念,POD (plain old data),指标量型别或者传统的C struct型别。POD型别拥有无关痛痒的(trivial)构造/析构/复制构造/赋值函数,对于POD型别采用最有效的初值填写或者释放手法,而对于non-POD采用最保险安全的构造或者析构做法,来提高效率。

这里__type_traits有许多typedefs,包括 :has_trivial_default_constructor\has_trivial_copy_constructor\has_trivial_assignment_constructor\has_trivial_default_destructor\is_POD_type等,其值不是__true_type就是__false_type,默认是__false_type。

这样就可以根据类型来尽量提高分配或者回收内存时的效率。



《STL源码剖析》学习--traits相关推荐

  1. STL源码剖析学习七:stack和queue

    STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...

  2. STL源码剖析学习二:空间配置器(allocator)

    STL源码剖析学习二:空间配置器(allocator) 标准接口: vlaue_type pointer const_pointer reference const_reference size_ty ...

  3. STL源码剖析学习之increment、decrement、dereference实现源码

    //STL之increment.decrement.dereference实现源码 //学习目的:STL实现原理.操作符(++i,i++,*等操作符的重载) //increment/dereferen ...

  4. STL源码剖析—学习记录

    提示:建议看完侯捷老师的STL标准库视频后,再看这本书,会看的下去一些!本人对其中重点内容和概念进行了提取,希望对一起前行的人有些许帮助,码字不易,欢迎点个赞呦! 文章目录 一.可能令你困惑的C++语 ...

  5. STL源码剖析学习十四:算法之set相关算法

    STL中定义的set要求元素不得重复且已经排序 set算法要求的都是有序区间,但元素可以重复出现 另外提供的hash版本的set因为其元素无序,因此不能作为set函数的参数 set算法前4个参数分别表 ...

  6. 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1

    最近在看侯捷的<STL源码剖析>,虽然感觉自己c++看得比较深一点,还是感觉还多东西不是那么明白,这里将一些细小的东西或者概念记录一下. 有些东西是根据<C++编程思想>理解的 ...

  7. 《STL源码剖析》学习--6章--_rotate算法分析

     最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. <STL源码剖析>学习--6章--random access ite ...

  8. 《STL源码剖析》学习--6章--power算法分析

    最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. 6章--power算法分析 书本中的算法如下所示: template <clas ...

  9. 《STL源码剖析》相关面试题总结

    一.STL简介 STL提供六大组件,彼此可以组合套用: 容器 容器就是各种数据结构,我就不多说,看看下面这张图回忆一下就好了,从实现角度看,STL容器是一种class template. 算法 各种常 ...

  10. 【《STL源码剖析》提炼总结】 第1节:空间配置器 allocator

    文章目录 一. 什么是空间配置器 二. STL allocator的四个操作: allocate,deallocate,construct,destroy `construct()` `destroy ...

最新文章

  1. 2021年大数据ELK(十一):Elasticsearch架构原理
  2. php isset()与empty()详解
  3. 死磕java并发cas_死磕 java并发包之AtomicInteger源码分析
  4. reactjs错误边界:用来捕获后代组件的错误,渲染出备用页面
  5. 怎样快速识别 英文地址中包含非英文字符_[论文笔记]端到端的场景文本识别算法--CRNN 论文笔记...
  6. 【天池赛事】零基础入门语义分割-地表建筑物识别 Task3:网络模型结构发展
  7. Vue2.0通过二级路由实现页面切换
  8. 中华黑豹增强版木马分析
  9. 再问数据中台 - 数据中台里的数据质量应该如何保障?
  10. MiniGUI编程--编辑框
  11. APP价格标签页设计灵感!多款案例选择!
  12. 【转】DataTable与实体类互相转换
  13. 去掉源代码里的debug标致
  14. 服务器被攻击ip显示国外,服务器被不同的IP攻击怎么破?
  15. java请假系统毕业设计_jsp企业员工考勤管理系统
  16. android gif 卡顿,Android SketchImageView 加载Gif图片,解决界面不流畅卡顿问题
  17. 航班可售舱位及机票价格查询api实例
  18. 【python】使用jieba分词并导出txt
  19. 0ctf Babyheap 2017
  20. 虚拟服务器zend optimizer,windows服务器配置Zend Optimizer方法-安装Zend Optimizer步骤-SEO优化-猴子技术宅...

热门文章

  1. 获取列表中最大N个数的索引
  2. day24 面向对象与实例属性
  3. 使用MySQL的LAST_INSERT_ID--转
  4. DNS服务器全面解析--转
  5. Memcached分布式算法详解--转
  6. Java最大的优势真的在于跨平台吗?
  7. 深入理解分布式技术 - 负载均衡实现之一致性哈希算法
  8. Java-查看JVM从哪个JAR包中加载指定类
  9. Java学习笔记(一)--JDK环境
  10. java程序有连接数据库_Java程序连接数据库