2015-03-02 5 views
1

Является ли хорошей практикой сделать регулярный итератор (или аналогичный диапазон или класс представления) получить из соответствующего const_iterator?Должен ли регулярный итератор (или аналогичный класс/класс) получать из const_iterator?

мотивация для этого

  • обмена код и
  • избежать преобразования, когда итератор/вид большой.

В качестве примера, рассмотрим вид 3D сетки, т.е. участок сетки. Он может содержать 1 указатель, 3 размера и 2-3 шага, всего 384 байта.

Состоящие и мутирующие версии имели бы лот общей функциональности (все, что вы можете сделать с трехмерной сеткой только для чтения).

против мотивации для приведенного выше примера является то, что сопзИте представление содержит константный указатель, и поэтому вид Mutating бы сделать const_cast использовать его, или добавить дополнительное поле, содержащее тот же адрес в неконтинентный указатель.

+0

Нет, это делает const_iterator атератором (мутирующим) –

+3

. Если что-то должно быть обратным отношением ..., любая операция, которую вы можете сделать с помощью 'const_iterator', является действительной операцией на' iterator', но не другой способ вокруг. Опять же, я бы не использовал наследование по умолчанию для итераторов, я могу * злоупотреблять * его, если сложность кода итератора делает его взломать, но я бы избегал этого [возможно, перевести реализацию в третий тип и поделиться кодом как в 'итераторе', так и' const_iterator' –

+0

@ DavidRodríguez-dribeas Спасибо, я отменил отношения наследования в моем вопросе. Надеюсь, это не является нарушением SO-этикета. – MaxB

ответ

2

Если есть наследование между const_iterator и итератором, это, вероятно, должно идти другим путем. Это итератор const предоставляет базовую возможность навигации, а изменчивый итератор добавляет возможность изменять цель (реализуется путем обеспечения защищенного доступа к внутренним константам const_iterator).

Редактировать: исходный вопрос задан о получении const_iterator из итератора. Это плохая идея, как и я, и Давид Родригес указывали почти в то же время.

С пересмотренным вопросом, получая итератор от const_iterator, комментарий Дэвида обеспечивает лучший ответ. Это можно сделать, но это, как правило, не очень хорошая идея.

В качестве встречного вопроса: какое преимущество вы видите в использовании наследования для этого случая? Если есть преимущество, имеет ли общий базовый класс (iterator_impl), из которого производятся оба итератора и const_iterator, такое же преимущество?

+0

Спасибо! Я изменил отношения наследования в своем вопросе. Надеюсь, это не является нарушением SO-этикета. – MaxB

+0

Это сбивает с толку, потому что два комментария и ответ, который вы получили до сих пор, основаны на вашем исходном вопросе. –

Смежные вопросы