我有以下代码,它执行一些迭代算法:
template<class Iterator>
void Foo(Iterator first, Iterator last) {
typedef typename Iterator::value_type Value;
std::vector<Value> vec;
vec.resize(last - first);
// ...
}
(last - first)
表达式 (AFAIK) 仅适用于随机访问迭代器(例如来自 vector
和 deque
的迭代器)。如何检查传递的迭代器满足此要求的代码?
最佳答案
如果Iterator
是一个随机访问迭代器,那么</p>
std::iterator_traits<Iterator>::iterator_category
将是 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 在一本Effective C++ 书中讨论了这种技术(我不记得是哪一本了)。
关于c++ - 如何检查传递的迭代器是随机访问迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4307271/