Effective C++ Item 47 请使用 traits classes 表现类型信息
本文为senlie原创。转载请保留此地址:http://blog.csdn.net/zhengsenlie
经验:Traits classes 使得"类型相关信息"在编译期可用。它们以 templates 和 "templates 特化"完毕实现
演示样例:
template<...>
class deque{
public:
class iterator{
public:
typedef random_access_iterator_tag iterator_category;
};
};
//template
template<typename IterT>
struct iterator_traits{
typedef typename IterT::iterator_category iterator_category;
};
//template 偏特化
template<typename IterT>
struct iterator_traits<IterT *> // template 偏特化。限制 IterT 必须是指针
{
typedef random_access_iterator_tag iterator_category;
}; //实现 advance
template<typename IterT, typename DistT>
void advance(IterT &iter, DistT d){
if(typeid(typename std::iterator_traits<IterT>::iterator_category) == typeid(std::random_access_iterator_tag))
...
}
解析:上面 iterator_traits<IterT>::iterator_category 在编译期就可确定。但 if 语句却是在执行期才会核定,浪费时间,也造成可执行文件的膨胀。
纠正:融合重载技术后。traits classes 有可能在编译期对类型运行 if...else 測试
template<typename IterT, typename DistT>
void advance(IterT &iter, DistT d){
doAdvance(iter, d, typename std::iterator_traits<T>::iterator_category());
} template<typename IterT, typename DistT>
void advance(IterT &iter, DistT d, std::random_access_iterator_tag){
iter += d;
} template<typename IterT, typename DistT>
void advance(IterT &iter, DistT d, std::bidirectional_iterator_tag){
if(d >= 0){while(d--) ++iter;}
else{while(d++) --iter;}
} template<typename IterT, typename DistT>
void advance(IterT &iter, DistT d, std::input_iterator_tag){
if(d < 0) throw std::out_of_range("Negative distance");
while(d--) ++iter;
}
Effective C++ Item 47 请使用 traits classes 表现类型信息的更多相关文章
- Effective C++ -----条款47:请使用traits classes表现类型信息
Traits classes使得“类型相关信息”在编译期可用.它们以template和“templates特化”完成实现. 整合重载技术(overloading)后,traits classes有可能 ...
- 【47】请使用traits classes表现类型信息
1.考虑下面的需求,对迭代器移动d个单位.因为不同类型的迭代器,能力不同,有的迭代器(vector,deque内置迭代器)可以一步到位移动到指定位置,有的迭代器(list内置迭代器)必须一步一步移动, ...
- 条款47:请使用traits class表示类型信息
在stl的算法中,我们的希望往往是根据不同的迭代器类型进行不同的更有效率的操作: template<typename IterT, typename DistT> void advance ...
- 读书笔记 effective c++ Item 47 使用traits class表示类型信息
STL主要由为容器,迭代器和算法创建的模板组成,但是也有一些功能模板.其中之一叫做advance.Advance将一个指定的迭代器移动指定的距离: template<typename IterT ...
- 读书笔记 effective c++ Item 54 让你自己熟悉包括TR1在内的标准库
1. C++0x的历史渊源 C++标准——也就是定义语言的文档和程序库——在1998被批准.在2003年,一个小的“修复bug”版本被发布.然而标准委员会仍然在继续他们的工作,一个“2.0版本”的C+ ...
- effective c++ Item 48 了解模板元编程
1. TMP是什么? 模板元编程(template metaprogramming TMP)是实现基于模板的C++程序的过程,它能够在编译期执行.你可以想一想:一个模板元程序是用C++实现的并且可以在 ...
- 读书笔记 effective c++ Item 55 让你自己熟悉Boost
你正在寻找一个高质量的,开源的,与平台和编译器无关的程序库的集合?看一下Boost吧.想加入一个由雄心勃勃的,充满天赋的正致力于最高水平的程序库设计和实现工作的C++程序员们组成的团体么?看一下Boo ...
- 读书笔记 effective c++ Item 48 了解模板元编程
1. TMP是什么? 模板元编程(template metaprogramming TMP)是实现基于模板的C++程序的过程,它能够在编译期执行.你可以想一想:一个模板元程序是用C++实现的并且可以在 ...
- Effective C++ 条款47
本节条款的题目:请使用trait classes来表示类型信息 本节条款主要讲述的技术是怎样在编译期间实现对迭代器类型的推断,依据推断的类型进行最优处理. 我们先来看一下迭代器的种类: 1.input ...
随机推荐
- 【Java_基础】java中的多态性
方法的重载.重写和动态链接构成了java的多态性. 1.方法的重载 同一个类中多个同名但形参有所差异的方法,在调用时会根据参数的不同做出选择. 2.方法的重写 子类中重新定义了父类的方法,有关方法重写 ...
- (21)zabbix创建触发器trigger
1. 创建触发器 了解了什么触发器,接下来看下zabbix触发器怎么创建和配置,方法很简单,请大家往下读,有什么问题请留言. 创建触发器步骤: 点击Configuration(配置) → Hosts( ...
- 剑指Offer(书):树的子结构
题目:输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 分析:关于二叉树大部分适应于递归结构. public boolean HasSubtree(TreeN ...
- 水题:UVa253-Cube painting
Cube painting We have a machine for painting cubes. It is supplied with three different colors: blue ...
- python模块--random
random主要用于生成随机字符串等,例如登录页面上随机字符串验证. random常用方法: import random print(random.randrange(1, 10)) # 返回1-10 ...
- 对Thymeleaf的一些笼统介绍和理解
(随手记录的,,可能没那么易看,sorry le) 先大概介绍一下关于Thymeleaf的概念和理解:首先Thymeleaf模板引擎(换句话说他是现代服务器端的Java模板引擎,) 他所对应的主要作用 ...
- 【02】xmind如何修改默认线条设置
[02]xmind如何修改不同主题的默认线条设置 魔芋:每次都是曲线.更喜欢为直线.因为曲线的路线是不确定的,看起来就显示很凌乱. 用everything搜索defaultStyles.xml ...
- [android 应用框架api篇] bluetooth
bluetooth接口 android.bluetooth.jar 官网网址: 接口类: https://developer.android.com/reference/android/bluetoo ...
- mysql5.7.20搭建
官网mysql下载源码安装 下载MySQL5.7.20源码包,wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.20.tar.g ...
- 开源中国+soucetree
参考链接:http://www.cocoachina.com/programmer/20151012/13682.html 1.创建一个工程