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

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

15
задан Community 23 May 2017 в 10:33
поделиться

3 ответа

Да, это нормально. Так, например, структурирована реализация VC10 итераторов для вектора . См. _Vector_iterator и _Vector_const_iterator в .

Между прочим, итераторы писать сложно. Стоит потратить время на изучение и использование библиотеки boost :: iterator.

7
ответ дан 1 December 2019 в 05:07
поделиться

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

-1
ответ дан 1 December 2019 в 05:07
поделиться

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

Даже если вы не хотите зависеть от частей 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)

Поэтому, в отличие от других здесь, я не считаю это "прекрасным".

2
ответ дан 1 December 2019 в 05:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: