在完成一个迭代器的时候,我们可能会暴露太多的细节在外面,为了将这些细节给隐藏,我们需要封装,这也是为什么每一种STL容器都提供了一种专属的迭代器。

为了解决以“迭代器所指对象的型别”为型别

解决办法是:利用template的参数推导(argument deducation)

template<class I,class T>
void func_impl(T iter,T t)
{
T temp;//这里解决了问题,T就是所指的对象的型别
}; template<class I>
void func(I iter)
{
func_impl(iter,*iter);//传入的一个是迭代器,一个是迭代器所指的对象的类型
}

这里编译器会自动进行template类型推导,于是可以推导出型别T,顺利解决问题。

(迭代器相应型别不止是迭代器所指对象的型别一种,最常用的有5种:value_type,difference_type,reference_type,pointer_type,iterator_category)


为了解决以迭代器所指对象型别为返回值的问题

在这里我们使用声明内嵌型类型来解决问题:

template<class T>
struct MyIter{
typedef T value_type;//声明内嵌型型别(nested type)
T*ptr;
MyIter(T*p=0):ptr(p){}
T&operator*(){return *ptr}
}; template<class I>
typename I::type_value
func(I ite){
return *ite;
} int main()
{
MyIter<int> ite(new int(8));
cout<<func(ite);//输出结果为8
}

但是这种方法有一个隐藏的缺点:无法为原生指针类型制作迭代器,因为内建类型无法定义内部的value_type,所以我们还需要针对特定情况做特定的处理,这时候我们需要特偏化处理(template partial specialization)


特偏化(template partial specialization)

(1) 类模板的偏特化

例如c++标准库中的类vector的定义

template

template<class T>
struct iterator_traits{
typedef typename T::value_type value_type;
//这里多加了一层封装,好处是traits可以拥有特化的版本(这里我还是不清楚,为什么说加了封装才能有特化的版本?)
}; //特化的版本1,为了解决原生指针,比如:int*
template<class T>
struct iterator_traits<T*>{
typename T value_type;//如果是个Int*,可以萃取出int类型
}; //特化版本2,为了解决原生的const指针,比如:const int*
template<class T>
struct iterator_traits<const T*>{
typename T value_type;//如果是个const int*,可以从中萃取出int类型
}



最后的效果就像图中这样。

《STL源码剖析》traits技法分析的更多相关文章

  1. 【STL 源码剖析】浅谈 STL 迭代器与 traits 编程技法

    大家好,我是小贺. 点赞再看,养成习惯 文章每周持续更新,可以微信搜索「herongwei」第一时间阅读和催更,本文 GitHub : https://github.com/rongweihe/Mor ...

  2. 《STL源码剖析》学习之traits编程

    侯捷老师在<STL源码剖析>中说到:了解traits编程技术,就像获得“芝麻开门”的口诀一样,从此得以一窥STL源码的奥秘.如此一说,其重要性就不言而喻了.      之前已经介绍过迭代器 ...

  3. STL源码剖析 迭代器(iterator)概念与编程技法(三)

    1 STL迭代器原理 1.1  迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型,STL设计的精髓在于,把容器(Containers)和算法(Algorithms)分开,而迭代器(i ...

  4. STL源码阅读-traits与迭代器

    迭代器模式 提供一种方法,使之能够依序访问容器的各个元素,而又无需暴露容器的内部表述方式 STL设计的中心思想在于将数据容器和算法分离开,容器和算法分开设计,迭代器则是两者之间的胶着剂,一般迭代器的设 ...

  5. STL"源码"剖析-重点知识总结

    STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合 ...

  6. 【转载】STL"源码"剖析-重点知识总结

    原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点 ...

  7. STL"源码"剖析

    STL"源码"剖析-重点知识总结   STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略 ...

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

    原文链接:http://www.cnblogs.com/raichen/p/5817158.html 一.STL简介 STL提供六大组件,彼此可以组合套用: 容器容器就是各种数据结构,我就不多说,看看 ...

  9. STL源码剖析之序列式容器

    最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...

  10. STL源码剖析 — 空间配置器(allocator)

    前言 以STL的实现角度而言,第一个需要介绍的就是空间配置器,因为整个STL的操作对象都存放在容器之中. 你完全可以实现一个直接向硬件存取空间的allocator. 下面介绍的是SGI STL提供的配 ...

随机推荐

  1. 开源数字基础设施 项目 -- Speckle

    [Speckle](https://speckle.systems/)是用于 3D 设计的任何东西的开源数字基础设施.处理软件孤岛.实时协作.数据管理.版本控制和自动化之间的互操作性.致力于构建一个开 ...

  2. 关于.Net 7.0 RC gRPC JSON 转码为 Swagger/OpenAPI文档的注意事项

    大家好,我是失业在家,正在找工作的博主Jerry,找工作之余,看到.Net 7.0 RC2发布了,就想测试下.Net 7.0 RC2 gRPC JSON 转码为 Swagger/OpenAPI文档的特 ...

  3. html小总结(哪些可以直接设置高度和宽度)

    (1)当然块级元素是可以直接设置高度和宽度的 块级元素:块级大多为结构性标记 div.h1~h6.ul.ol.dl.form.table.p.hr.pre.address.center.blockqu ...

  4. 【单元测试】Junit 4(二)--eclipse配置Junit+Junit基础注解

    1.0 前言 ​ 前面我们介绍了白盒测试方法,后面我们来介绍一下Junit 4,使用的是eclipse(用IDEA的小伙伴可以撤了) 1.1 配置Junit 4 1.1.1 安装包 我们需要三个jar ...

  5. 如何使用vscode快速配置C语言环境(简单实用)

    需要用到的工具: VSCode(Visual Studio Code) 一.首先打开官网链接,然后根据自己的电脑选择合适的安装程序进行下载. 二.在安装时默认点击下一步,最后记得勾选上添加path到系 ...

  6. Flask框架:运用Ajax轮询动态绘图

    Ajax是异步JavaScript和XML可用于前后端交互,在之前<Flask 框架:运用Ajax实现数据交互>简单实现了前后端交互,本章将通过Ajax轮询获取后端的数据,前台使用echa ...

  7. C#串口初始化

    //通信端口 string[] PortList = SerialPort.GetPortNames(); if (PortList.Length > 0) { this.cmb_Port.Da ...

  8. gin-k8s 运行的问题

    1,k8s admin dashboard项目地址:https://github.com/kubernetes/dashboard项目使用的是golang 作为后端,然后使用angular 作为前段框 ...

  9. Go语言核心36讲37

    你好,我是郝林,今天我们继续来分享并发安全字典sync.Map的内容. 我们在上一篇文章中谈到了,由于并发安全字典提供的方法涉及的键和值的类型都是interface{},所以我们在调用这些方法的时候, ...

  10. SQL-GROUP BY语句在MySQL中的一个错误使用被兼容的情况

    首先创建数据库hncu,建立stud表格. 添加数据: create table stud(sno varchar(30) not null primary key,sname varchar(30) ...