Написание унифицированных функций для итераторов. Выбор категории итератора

   
На этом шаге мы рассмотрим особенности реализации в зависимости от категории итератора.

   
Выбор реализации в зависимости от категории итератора выполняется в два этапа.

  • При вызове другой функции ваша шаблонная функция передает ей категорию итератора в качестве дополнительного аргумента. Пример:
    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.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий