|
Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программПо соглашению характеристики всегда реализуются в виде структур. Другое соглашение заключается в том, что структуры, используемые для их реализации, почему-то называются классами- характеристиками. Смысл iterator_traits состоит в том, что для каждого типа IterT определяется псевдоним typedef iterator_category для структуры iterator_traits<IterT>. Этот typedef идентифицирует категорию, к которой относится итератор IterT. Реализация этой идеи в iterator_traits состоит из двух частей. Первая вводится требование, чтобы все определяемые пользователем типы итераторов имели внутри себя вложенный typedef с именем iterator_category, который задает соответствующую структуру-тэг. Например, итераторы deque являются итераторами с произвольным доступом, поэтому класс итераторов deque должен выглядеть примерно так: template <> class deque { public: class iterator { public: typedef random_access_iterator_tag iterator_category; ... }; ... }; Итераторы для контейнеров list являются двунаправленными, поэтому для них объявление выглядит так: template <> class list { public: class iterator { public: typedef bidirectional_iterator_tag iterator_category; }; ... }; В шаблоне iterator_traits просто повторен находящийся внутри класса итератора typedef: // iterator_category для типа IterT это то, что сообщает о нем сам IterT // см. вPправиле 42 информацию об использовании typedef typename template <typename IterT> struct iterator_traits { typedef typename IterT::iterator_category iterator_category; ... }; Это работает с пользовательскими типами, но не подходит для итераторов, которые являются указателями, потому что не существует указателей с вложенными typedef ...» |
Код для вставки книги в блог HTML
phpBB
текст
|
|