Chcę mieć interfejs ModelGenerator, który ma metodę generate(), która pobiera listę dowodów i tworzy model. Korzystanie z STL pseudo-kaczka-typowania iterator idiom ...Metoda wirtualna C++, która przyjmuje iteratory w stylu STL
template<class Model>
class ModelGenerator {
public:
template<class Iterator>
virtual bool generate(Iterator begin, Iterator end, Model& model) = 0;
};
Ale funkcje wirtualne nie można matrycy. Więc mam do szablonu całą klasę:
template<class Model, class Iterator>
class ModelGenerator {
public:
virtual bool generate(Iterator begin, Iterator end, Model& model) = 0;
};
Idealnie co chciałbym zrobić, to coś takiego ...
template<class Model, class Evidence>
class ModelGenerator {
public:
virtual bool generate(iterator<Evidence>& begin,
iterator<Evidence>& end,
Model& model) = 0;
};
Ale nie ma takiego interfejsu, który iteratory dziedziczyć. (Klasa std :: iterator zawiera tylko parę typedefs, bez metod.)
Jedyny sposób, w jaki mogę to zrobić, to nadanie modelowi Generation metody addEvidence(), która dodaje je jeden po drugim przed wywołaniem generowania (), ale wtedy muszę podać stan ModelGenerator, który jest trochę uciążliwy.
Jak mogę napisać wirtualną metodę, która pobiera dowolny kontener STL?
CRTP może być tu przydatny. – Mehrdad
Powinieneś pomyśleć o rozróżnieniu wszystkich operacji iteracyjnych od funkcji wirtualnej. Funkcja szablonowa może generować 'std :: vector' i przekazywać ją do funkcji 'virtual'. Koszt wydajności i wysiłek programistyczny tego rodzaju opakowania jest prawdopodobnie mniejszy niż 'any_iterator' /' any_range'. –
Potatoswatter