traits编程技法利用了“内嵌型别”的编程技巧与编译器的template参数推导功能。

下面主要看看利用traits编程技法实现的迭代器萃取机制。

5种迭代器类型定义:

struct input_iterator_tag {};
struct output_iterator_tag {};
struct forward_iterator_tag : public input_iterator_tag {};
struct bidirectional_iterarot_tag : public forward_iterator_tag {};
struct random_access_iterator_tag : public bidirectional_iterarot_tag {};

std::iterator的定义

template <class Category, class T, class Distance = ptrdiff_t,
class Pointer = T*, class Reference = T&>
struct iterator {
typedef Category iterator_category;
typedef T value_type;
typedef Distance difference_type;
typedef Pointer pointer;
typedef Reference reference;
};

如果想和STL协同工作,自行定义的迭代器必须定义iterator_category、value_type、difference_type、pointer、reference这五大内嵌型别。为了方便,STL定义了std::iterator这个基类,自定义的迭代器只要继承这个基类

就可以了。但要注意的是,并不是STL中的所有迭代器都继承了这个基类,比如_deque_iterator。

"榨汁机"traits

template <class Iterator>
struct iterator_traits {
typedef typename Iterator::iterator_category iterator_category;
typedef typename Itetator::value_type value_type;
typedef typename Iterator::difference_type difference_type;
typedef typename Iterator::pointer pointer;
typedef typename Iterator::reference reference;
};

由于原生指针也是一种迭代器,但是原生指针没有内嵌型别,因此,iterator_traits需要为原生指针提供特化版本。

template <class T>
struct iterator_traits<T*> {
typedef random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference;
}; template <class T>
struct iterator_traits<const T*> {
typedef random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef const T* pointer;
typedef const T& reference;
};

最新文章

  1. QT中使用函数指针
  2. 深入理解javascript原型和闭包(4)——隐式原型
  3. JDBC连接实例
  4. 21045308刘昊阳 《Java程序设计》第九周学习总结
  5. python 练习 30
  6. 通过GCD、NSOperationQueue队列、NSThread三种方法来创建多线程
  7. Asp.net 实现图片缩放 无水印(方法二)
  8. 嵌入式程序员应知道的0x10个基本问题
  9. NLP论文泛读之《教材在线评论的情感倾向性分析》
  10. hbase性能优化总结
  11. 初识RESTful
  12. Linux虚拟机搭建本地yum源
  13. 多个.txt文件合并到一个.txt文件中
  14. Python中type和object
  15. 漏洞复现——Apache HTTPD多后缀解析漏洞
  16. Mac下IntelliJ IDEA快捷键大全
  17. os.system
  18. ubuntu 调节音量命令 声卡驱动
  19. 2 c++对象被使用前要先被初始化
  20. vmware的硬件选项里有关于虚拟化引擎的选项(虚拟机支持硬件虚拟化)

热门文章

  1. 使用基于vuecli创建的目录推送到指定远程分支
  2. leetcode c++做题思路和题解(3)——栈的例题和总结
  3. 自己总结 :并发队列ConcurrentLinkedQueue、阻塞队列AraayBlockingQueue、阻塞队列LinkedBlockingQueue 区别 和 使用场景总结
  4. CORS漏洞的学习与分析
  5. 【three.js第五课】光线的添加和感光材料
  6. 2019CCPC-江西省赛(重现赛)- 感谢南昌大学
  7. Jwt认识与攻击
  8. Category、load、initialize 源码讲解
  9. 从零开始学习docker之docker的安装
  10. Mac安装aws-cli全过程,通过命令行上传文件到aws s3协议服务器