Каковы типичные случаи использования iterator_trait - PullRequest
19 голосов
/ 19 июля 2011

Я новичок в C ++, поэтому, пожалуйста, потерпите меня.Я пытаюсь понять STL iterator_traits.В книге «Стандартная библиотека C ++» структура iterator_traits определена следующим образом:

template <class T>
struct iterator_traits{
  typedef typename T::value_type value_type
  typedef typename T::difference_type difference_type
  typedef typename T::iterator_category iterator_category
  typedef typename T::pointer pointer
  typedef typename T::reference reference
}

Так что мне кажется, что она повторно выставляет подтипы, которые уже выставляет T.Продвигаясь дальше, в книге приведен пример того, как его использовать, что-то вроде следующего:1008 *, разве я не могу получить его напрямую от MyIterator?Моя путаница, кажется, возникает из-за моего (безусловно, неверного) понимания, что информация о подтипах должна быть взята из template <class T>, используемого для создания экземпляра iterator_trait.Так что, если бы вы могли объяснить, и желательно с примером, зачем и где мне понадобится iterator_traits, это было бы очень полезно.

1 Ответ

22 голосов
/ 19 июля 2011

Указатели на массив могут использоваться в качестве итераторов произвольного доступа.

Должен быть какой-то согласованный способ получения этих типов для указателей (которые, очевидно, не могут иметь типы, объявленные как вложенные типы, посколькутолько классы могут иметь вложенные типы) и для итераторов типа класса.Шаблон класса признаков обеспечивает такой согласованный способ.

Шаблон класса iterator_traits предназначен для указателей, таких как:

template <typename T>
struct iterator_traits<T*>
{
    typedef std::random_access_iterator_tag iterator_category;
    typedef T                               value_type;
    typedef T*                              pointer;
    typedef T&                              reference;
    typedef std::ptrdiff_t                  difference_type;
};
...