【发布时间】:2012-05-25 23:07:55
【问题描述】:
我想要一个接口 ModelGenerator,它有一个方法 generate(),它接受一个可迭代的证据列表并创建一个模型。使用 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 类只包含一堆 typedef,没有方法。)
我能想到的唯一方法是给 ModelGenerator 一个方法 addEvidence(),它在调用 generate() 之前将它们一个一个添加,但是我必须给 ModelGenerator 状态,这有点痛苦。
如何编写一个接受任何 STL 容器的虚拟方法?
【问题讨论】:
-
您应该考虑从虚函数中分解出所有迭代器操作。模板化函数可能会生成
std::vector< Evidence * >并将其传递给virtual函数。这种包装器的性能成本和编程工作量可能低于any_iterator/any_range。
标签: c++ templates stl iterator virtual