博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
In a nutshell: Tags are for overloading, for optimization.
阅读量:5885 次
发布时间:2019-06-19

本文共 1327 字,大约阅读时间需要 4 分钟。

Take a simple advance as example, you might design:

template
void advance(II& i, D n){ while( n-- ) ++i;}

However it have O(n) complexity, which is not acceptable when you have a random_access_iterator. So you may change your design like this:

template
void advance_II(II& i, D n){ while( n-- ) ++i;}template
void advance_RAI(RAI& i, D n){ i += n;}template
void advance(II& i, D n){ if(is_random_access_iterator(i)) // not yet designed advance_RAI(i, n); else advance_II(i, n);}

However the version of function to use is decided at run-time, so we try to let compiler decided which method to choose at compile-time. So we give iterators tags. There are five tags:

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

Now you can do this:

template
void __advance(II& i, D n, input_iterator_tag){ while( n-- ) ++i;}template
void __advance(RAI& i, D n, random_access_iterator_tag){ i += n;}template
void advance(II& i, D n){ __advance(i, n, iterator_traits
::iterator_category());}

图片描述

转载地址:http://rhlix.baihongyu.com/

你可能感兴趣的文章
网格最短路径算法(Dijkstra & Fast Marching)(转)
查看>>
软链接和硬链接详解
查看>>
Redis_master-slave模式
查看>>
彻底卸载删除微软Win10易升方法
查看>>
SWT/JFACE之环境配置(一)
查看>>
应用程序日志中总是说MS DTC无法正确处理DC 升级/降级事件,是什么意思
查看>>
mybatis数据处理的几种方式
查看>>
作业2
查看>>
远程主机探测技术FAQ集 - 扫描篇
查看>>
C++中调用python函数
查看>>
Nomad添加acl认证
查看>>
“TI门外汉”网路知识笔记一 OSI参考模型
查看>>
你不需要jQuery(五)
查看>>
DatanodeDescriptor说明
查看>>
ServlertContext
查看>>
Python WOL/WakeOnLan/网络唤醒数据包发送工具
查看>>
sizeof(long)
查看>>
pxe网络启动和GHOST网克
查看>>
2.5-saltstack配置apache
查看>>
django数据库中的时间格式与页面渲染出来的时间格式不一致的处理
查看>>