El código que ha publicado ha corregido el tipo de iteradores devueltos desde Base
y todas sus implementaciones hasta std::vector<int>::iterator
, que probablemente no sea lo que desea. La sugerencia de Jeremías es una manera de ir con un inconveniente: que la compatibilidad suelto con STL ... Sé de tres implementaciones de un envoltorio iterador polimórfica:
any_iterator
(que implementa boost::iterator_facade
)
- la biblioteca de Becker
opaque_iterator
(google para ello), o
- biblioteca de poli muy interesante de Adobe que contiene una jerarquía de STL conforme
any_iterator
s.
El problema es más difícil de lo que parece ... Hice un yo intente principalmente porque necesitaba covarianza en any_iterators
argumento de tipo (any_iterator<Derived>
debería ser automáticamente convertible en any_iterator<Base>
) que es difícil de implementar limpiamente con STL como iteradores . Un C# como Enumerator<T>
es más fácil de implementar (*) (y en general es un concepto más limpio que los pares de iteradores similares a STL) pero, de nuevo, "pierde" el STL.
(*) = sin 'rendimiento' por supuesto :-)
La forma en que probablemente haría que es definir una clase base abstracta como '' iterador que actúa como un Java o C# iterador, una aplicación de plantilla de la de iteradores arbitrarias, a continuación, utilizar para envolver un Boost.Iterator interfaz de iterador en la parte superior de cualquier 'Iterator '. ¿Quieres que trate de esbozar un pseudocódigo para eso? –
Puede encontrar uno en http://thbecker.net/free_software_utilities/type_erasure_for_cpp_iterators/any_iterator.html – UncleBens