我有以下代码,它执行一些迭代器算术:
template<class Iterator>
void Foo(Iterator first, Iterator last) {
typedef typename Iterator::value_type Value;
std::vector<Value> vec;
vec.resize(last - first);
// ...
}
The (last - first)
表达式仅适用于随机访问迭代器(例如来自vector
and deque
)。如何在代码中检查传递的迭代器是否满足此要求?
If Iterator
是一个随机访问迭代器,那么
std::iterator_traits<Iterator>::iterator_category
will be std::random_access_iterator_tag
。实现这一点的最干净的方法可能是创建第二个函数模板并具有Foo
叫它:
template <typename Iterator>
void FooImpl(Iterator first, Iterator last, std::random_access_iterator_tag) {
// ...
}
template <typename Iterator>
void Foo(Iterator first, Iterator last) {
typedef typename std::iterator_traits<Iterator>::iterator_category category;
return FooImpl(first, last, category());
}
这样做的好处是可以超载FooImpl
如果您愿意,可以使用不同类别的迭代器。
斯科特·迈耶斯 (Scott Meyers) 在其中一篇文章中讨论了这项技术有效的C++书(我不记得是哪一本了)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)