采用STL样式迭代器的C++虚方法

Jac*_*dre 6 c++ virtual templates iterator stl

我想要一个接口ModelGenerator,它有一个方法generate(),它接受一个可迭代的Evidence列表并创建一个Model.使用STL伪鸭输入迭代器成语...

template<class Model>
class ModelGenerator {
  public:
    template<class Iterator>
    virtual bool generate(Iterator begin, Iterator end, Model& model) = 0;
};
Run Code Online (Sandbox Code Playgroud)

但虚函数无法模板化.所以我必须模拟整个班级:

template<class Model, class Iterator>
class ModelGenerator {
  public:
    virtual bool generate(Iterator begin, Iterator end, Model& model) = 0;
};
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想做的是这样的......

template<class Model, class Evidence>
class ModelGenerator {
  public:
    virtual bool generate(iterator<Evidence>& begin,
                          iterator<Evidence>& end,
                          Model& model) = 0;
};
Run Code Online (Sandbox Code Playgroud)

但迭代器没有继承这样的接口.(类std :: iterator只包含一堆typedef,没有方法.)

我能想到的唯一方法是给ModelGenerator一个方法addEvidence(),它在调用generate()之前逐个添加它们,但是我必须给出一个有点痛苦的ModelGenerator状态.

如何编写一个带有任何STL容器的虚方法?

K-b*_*llo 5

你似乎需要一个any_iterator.这是一个迭代器,它执行类型擦除以使您与实际的迭代器实现绝缘.

Adobe有一个实现any_iterator:http: //stlab.adobe.com/classadobe_1_1any__iterator.html

Boost有一个实现any_range:http: //www.boost.org/doc/libs/1_49_0/libs/range/doc/html/range/reference/ranges/any_range.html

  • @abarnert:`any_iterator`的事情是每个advance,comparison,increment操作都涉及一个`virtual`调用.所以开销很大,值得一提. (3认同)
  • Boost.Range中有`any_range`. (2认同)