我想要一个接口ModelGenerator,它有一个方法generate(),它接受一个可迭代的Evidence列表并创建一个Model . 使用STL伪鸭子类型迭代器成语...
template<class Model>
class ModelGenerator {
public:
template<class Iterator>
virtual bool generate(Iterator begin, Iterator end, Model& model) = 0;
};
但是虚函数不能模板化 . 所以我必须模拟整个 class :
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只包含一堆typedef,没有方法 . )
我能想到的唯一方法是给ModelGenerator一个方法addEvidence(),它在调用generate()之前逐个添加它们,但是我必须给出一个有点痛苦的ModelGenerator状态 .
如何编写一个带有任何STL容器的虚方法?
2 回答
你似乎需要
any_iterator
. 这是一个迭代器,它执行类型擦除以使您与实际的迭代器实现绝缘 .Adobe有一个
any_iterator
的实现:http://stlab.adobe.com/classadobe_1_1any__iterator.htmlBoost实现了
any_range
:http://www.boost.org/doc/libs/1_49_0/libs/range/doc/html/range/reference/ranges/any_range.html您可以考虑使用模板专门化而不是虚拟方法 . 根据我的理解,您有一个独特的Evidence类,一些不同的Model类,并且需要创建一个通用工厂来从一系列证据中生成一个选定的模型 .
你可以这样使用它: