请教条款47:请使用traits classes表现类型信息的问题
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() 为什么要加括号? 谢谢。