STL之traits编程技法
2024-09-21 20:41:33
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;
};
最新文章
- QT中使用函数指针
- 深入理解javascript原型和闭包(4)——隐式原型
- JDBC连接实例
- 21045308刘昊阳 《Java程序设计》第九周学习总结
- python 练习 30
- 通过GCD、NSOperationQueue队列、NSThread三种方法来创建多线程
- Asp.net 实现图片缩放 无水印(方法二)
- 嵌入式程序员应知道的0x10个基本问题
- NLP论文泛读之《教材在线评论的情感倾向性分析》
- hbase性能优化总结
- 初识RESTful
- Linux虚拟机搭建本地yum源
- 多个.txt文件合并到一个.txt文件中
- Python中type和object
- 漏洞复现——Apache HTTPD多后缀解析漏洞
- Mac下IntelliJ IDEA快捷键大全
- os.system
- ubuntu 调节音量命令 声卡驱动
- 2 c++对象被使用前要先被初始化
- vmware的硬件选项里有关于虚拟化引擎的选项(虚拟机支持硬件虚拟化)
热门文章
- 使用基于vuecli创建的目录推送到指定远程分支
- leetcode c++做题思路和题解(3)——栈的例题和总结
- 自己总结 :并发队列ConcurrentLinkedQueue、阻塞队列AraayBlockingQueue、阻塞队列LinkedBlockingQueue 区别 和 使用场景总结
- CORS漏洞的学习与分析
- 【three.js第五课】光线的添加和感光材料
- 2019CCPC-江西省赛(重现赛)- 感谢南昌大学
- Jwt认识与攻击
- Category、load、initialize 源码讲解
- 从零开始学习docker之docker的安装
- Mac安装aws-cli全过程,通过命令行上传文件到aws s3协议服务器