На этом шаге мы рассмотрим особенности реализации в зависимости от категории итератора.
Выбор реализации в зависимости от категории итератора выполняется в два этапа.
template <class Iterator> inline void foo (Iterator beg, Iterator end) { foo (beg, end, std::iterator_traits<Iterator>::iterator_category()); }
// foo() для двунаправленных итераторов template <dass BiIterator> void foo (BiIterator beg, BiIterator end, std::bidirectional_iterator_tag);
Версия для итераторов произвольного доступа могла бы, например, использовать возможности, не поддерживаемые двунаправленными итераторами. Благодаря иерархической структуре тегов итераторов можно предоставить одну реализацию для нескольких категорий итераторов.
На следующем шаге мы рассмотрим выбор реализации для функции distance.