2011-02-22 13 views
5

¿Es posible implementar un iterador cualquiera con la fachada de boost iterator? no quiero para definir los detalles de implementación en mi clase baseAnyIterator y aumentar la fachada del iterador

class Base 
{ 
public: 
typedef std::vector<int>::iterator iterator;//implementation detail 
... 
virtual iterator begin()=0; 
virtual iterator end()=0; 
}; 

o tengo que escribir uno desde cero;

+0

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? –

+1

Puede encontrar uno en http://thbecker.net/free_software_utilities/type_erasure_for_cpp_iterators/any_iterator.html – UncleBens

Respuesta

9

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:

  1. any_iterator (que implementa boost::iterator_facade)
  2. la biblioteca de Becker opaque_iterator (google para ello), o
  3. 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 :-)

3

Creo que esto puede ser lo que usted está buscando:

any_iterator: Type Erasure for C++ Iterators

He aquí un fragmento de esa página ::

Descripción general

La plantilla de clase any_iterator es la función análoga para impulsar :: para los iteradores . Le permite tener una única variable y asignarle iteradores de diferentes tipos, siempre y cuando estos iteradores tengan una coincidencia común .

Cuestiones relacionadas