Подтвердить что ты не робот

Каковы типичные варианты использования iterator_trait

Я новичок в С++, поэтому, пожалуйста, несите меня. Я пытаюсь понять STL iterator_traits. В книге "Стандартная библиотека С++" структура 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 уже предоставляет. Двигаясь дальше, книга дает пример того, как ее использовать, что-то вроде следующего

template <class MyIterator>
void do_something(MyIterator start, MyIterator end) {
    typedef typename iterator_traits<MyIterator>::value_type value_type
    value_type v = *start
    .....

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

4b9b3361

Ответ 1

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

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

Шаблон класса 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;
};