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