Виртуальный метод C++, использующий итераторы в стиле STL.

Я хочу иметь интерфейс 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?

6
задан Jack Valmadre 25 May 2012 в 23:07
поделиться