Код, который вы разместили, исправил тип итераторов, возвращаемых с Base
, и все его реализации к std::vector<int>::iterator
, что, вероятно, не то, что вам нужно.Предложение Иеремии - один из способов преодолеть один недостаток: вы теряете совместимость с STL ... Мне известны три реализации полиморфной оболочки-итератора:
- Беккер
any_iterator
(которая реализует boost::iterator_facade
) - библиотека
opaque_iterator
(Google для нее) или - Очень интересная поли-библиотека Adobe, которая содержит иерархию STL, соответствующую
any_iterator
s.
Проблема сложнее, чем может показаться ... Я попытался сам, главным образом потому, что мне была нужна ковариация в аргументе типа any_iterators
(any_iterator<Derived>
должен быть автоматически преобразован в any_iterator<Base>
), что трудно реализовать чисто с помощью итераторов, подобных STL,AC # like Enumerator<T>
проще в реализации (*) (и imho, как правило, более чистая концепция, чем STL-подобные пары итераторов), но опять же, вы «теряете» STL.
(*) = без 'даешь конечно: -)