Если Iterator
является итератором с произвольным доступом, то
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
для разных категорий итераторов, если вы 'Мне нравится.
Скотт Мейерс обсуждает эту технику в одной из книг Effective C ++ (я не помню, какая именно).