После другого вопроса об итераторах у меня есть некоторые сомнения относительно пользовательских контейнеров. В моем контейнере, iterator
подкласс const_iterator
, так, чтобы я получил преобразование от неконстанты до константы "бесплатно". Но это позволяется или является там какими-либо недостатками или нерабочими сценариями для такой установки?
Да, это нормально. Так, например, структурирована реализация VC10 итераторов для вектора
. См. _Vector_iterator
и _Vector_const_iterator
в
.
Между прочим, итераторы писать сложно. Стоит потратить время на изучение и использование библиотеки boost :: iterator.
Подумайте о случае, когда вам потребуется изменить элементы итератора.
Подклассирование кажется мне здесь странным, но на самом деле проблема существует.
Даже если вы не хотите зависеть от частей Boost, проверьте библиотеку Boost.Iterator, и особенно биты iterator_facade
и iterator_adaptor
.
Там есть полноценный пример того, как написать iterator
и const_iterator
для вашего класса, не дублируя слишком много. Их идея заключается в написании шаблона iterator_base
класса, который затем можно использовать для const и nonconst типов в строке:
template <class Value> class iterator_base;
typedef iterator_base<T> iterator;
typedef iterator_base<const T> const_iterator;
Проблема с подклассированием заключается в том, что вы должны затем предоставить виртуальный деструктор, и вы подвержены срезу (при создании const_iterator
из iterator
)
Поэтому, в отличие от других здесь, я не считаю это "прекрасным".