Может ли 'итератор' вводить только подкласс 'const_iterator'?

После другого вопроса об итераторах У меня есть некоторые сомнения относительно пользовательских контейнеров. В моем контейнере iterator является подклассом const_iterator, поэтому я получаю преобразование из константы в const "бесплатно". Но разрешено ли это или есть какие-то недостатки или нерабочие сценарии для такой настройки?

Ответ 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

Подумайте о случае, который потребует от вас изменения членов итератора.