Quiero tener una interfaz ModelGenerator que tenga un método generate() que tome una lista iterativa de Evidencia y cree un Modelo. Utilizando el STL pseudo-pato-tipificación iterador idioma ...Método virtual C++ que toma iteradores de estilo STL
template<class Model>
class ModelGenerator {
public:
template<class Iterator>
virtual bool generate(Iterator begin, Iterator end, Model& model) = 0;
};
Pero las funciones virtuales no pueden ser con plantilla. Así que tengo a la plantilla de la clase entera:
template<class Model, class Iterator>
class ModelGenerator {
public:
virtual bool generate(Iterator begin, Iterator end, Model& model) = 0;
};
Lo ideal sería que lo que me gustaría hacer es algo como esto ...
template<class Model, class Evidence>
class ModelGenerator {
public:
virtual bool generate(iterator<Evidence>& begin,
iterator<Evidence>& end,
Model& model) = 0;
};
Pero no hay tal interfaz que heredan de iteradores. (La clase std :: iterator solo contiene un montón de typedefs, no hay métodos.)
La única forma en que puedo pensar en hacerlo es darle a ModelGenerator un método addEvidence() que los agrega uno por uno antes de llamar a generate (), pero luego tengo que darle al estado ModelGenerator un poco de dolor.
¿Cómo puedo escribir un método virtual que tome cualquier contenedor STL?
CRTP podría ser útil aquí. – Mehrdad
Debería considerar factorizar todas las operaciones del iterador desde la función virtual. La función de plantilla podría generar un 'std :: vector' y pasarlo a la función 'virtual'. El costo de rendimiento y el esfuerzo de programación de ese tipo de contenedor es probable que sea menor que 'any_iterator' /' any_range'. –
Potatoswatter