请教条款47:请使用traits classes表现类型信息的问题

nzc123 2011-03-03 02:37:53
effective c++ 第三版最后举的例子:

同类型的iterator_category对象作参数的函数,我们将这函数取名为doAdvance:
//这份实现用于random access迭代器
template<typename IterT,typename DistT>
void doAdvance( IterT& iter, DistT d, std::random_access_iterator_tag)
{
iter += d;
}
//这份实现用于bidirectional迭代器
template<typename IterT,typename DistT>
void doAdvance( IterT& iter, DistT d, std::bidirectional_iterator_tag)
{
if( d >= 0 ){
while( d-- ){
++iter;
}
} else {
while( d++ ){
--iter;
}
}
}
//这份实现用于input迭代器
template<typename IterT,typename DistT>
void doAdvance( IterT& iter, DistT d, std::input_iterator_tag)
{
if( d < 0 ){
throw std::out_of_range( "Negative distance" );
}
while( d-- ){
++iter;
}
}
有了这些doAdvance重载版本,advance需要做的只是调用它们并额外传递一个对象,后者必须带有适当的迭代器分
类,于是编译器运用重载机制调用适当的实现代码:
template<typename IterT,typename DistT>
void advance( IterT& iter, DistT& d ){
doAdvance( iter, d, typename std::iterator_traits<IterT>::iterator_category() );
}

不知道为什么最后调用doAdvance时 最后一个参数是typename std::iterator_traits<IterT>::iterator_category() 为什么要加括号? 谢谢。
...全文
115 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
QQIANQQ 2011-03-03
  • 打赏
  • 举报
回复
不加的话是只能代表它是一种类型而已~加()代表要产生一个临时对象。这个临时对象在调用完doAdvance时会自动结束其生命!

欢迎拍砖!
QQIANQQ 2011-03-03
  • 打赏
  • 举报
回复
加上()代表的是产生一个临时对象,不是调用。
nzc123 2011-03-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bdmh 的回复:]

iterator_category本身是个struct
typedef _Int_iterator_tag iterator_category;
struct _Int_iterator_tag
{ // identifying tag for integer types, not an iterator
};

这就是个初始化实例,可以不加()
[/Quote]
谢谢楼上的回复,我就觉得奇怪,明明只是结构而已 ,为什么还要加上括号。
bdmh 2011-03-03
  • 打赏
  • 举报
回复
iterator_category本身是个struct
typedef _Int_iterator_tag iterator_category;
struct _Int_iterator_tag
{ // identifying tag for integer types, not an iterator
};

这就是个初始化实例,可以不加()
bdmh 2011-03-03
  • 打赏
  • 举报
回复
不加也可以

64,688

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧