Я хочу иметь интерфейс ModelGenerator, у которого есть метод generate(), который принимает итерируемый список Evidence и создает Модель. Использование псевдо-утиной итератора STL...
template<class Model>
class ModelGenerator {
public:
template<class Iterator>
virtual bool generate(Iterator begin, Iterator end, Model& model) = 0;
};
Но виртуальные функции не могут быть шаблонными. Поэтому я должен создать шаблон всего класса:
template<class Model, class Iterator>
class ModelGenerator {
public:
virtual bool generate(Iterator begin, Iterator end, Model& model) = 0;
};
В идеале я хотел бы сделать что-то вроде этого...
template<class Model, class Evidence>
class ModelGenerator {
public:
virtual bool generate(iterator<Evidence>& begin,
iterator<Evidence>& end,
Model& model) = 0;
};
Но нет такого интерфейса, от которого наследуются итераторы. (Класс std::iterator содержит только набор определений типов, без методов.)
Единственный способ, который я могу придумать, — предоставить ModelGenerator метод addEvidence(), который добавляет их один за другим перед вызовом generate(). , но тогда я должен дать состояние ModelGenerator, что немного больно.
Как мне написать виртуальный метод, который принимает любой контейнер STL?