Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;采用STL样式迭代器的虚拟方法_C++_Templates_Stl_Iterator_Virtual - Fatal编程技术网

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

C++ C++;采用STL样式迭代器的虚拟方法,c++,templates,stl,iterator,virtual,C++,Templates,Stl,Iterator,Virtual,我想要一个接口ModelGenerator,它有一个方法generate(),它接受一个iterable证据列表并创建一个模型。使用STL伪鸭式类型迭代器习惯用法 template<class Model> class ModelGenerator { public: template<class Iterator> virtual bool generate(Iterator begin, Iterator end, Model& model

我想要一个接口ModelGenerator,它有一个方法generate(),它接受一个iterable证据列表并创建一个模型。使用STL伪鸭式类型迭代器习惯用法

template<class Model>
class ModelGenerator {
  public:
    template<class Iterator>
    virtual bool generate(Iterator begin, Iterator end, Model& model) = 0;
};
模板
类模型生成器{
公众:
模板
虚拟布尔生成(迭代器开始、迭代器结束、模型和模型)=0;
};
但是虚拟函数不能被模板化。因此,我必须为整个班级制作模板:

template<class Model, class Iterator>
class ModelGenerator {
  public:
    virtual bool generate(Iterator begin, Iterator end, Model& model) = 0;
};
模板
类模型生成器{
公众:
虚拟布尔生成(迭代器开始、迭代器结束、模型和模型)=0;
};
理想情况下我想做的是这样的事情

template<class Model, class Evidence>
class ModelGenerator {
  public:
    virtual bool generate(iterator<Evidence>& begin,
                          iterator<Evidence>& end,
                          Model& model) = 0;
};
模板
类模型生成器{
公众:
虚拟布尔生成(迭代器和开始,
迭代器&end,
模型&Model)=0;
};
但是没有迭代器从中继承的接口。(类std::iterator只包含一组typedef,没有方法。)

我能想到的唯一方法是给ModelGenerator一个addEvidence()方法,它在调用generate()之前一个接一个地添加它们,但是我必须给ModelGenerator一个有点麻烦的状态


如何编写一个接受任何STL容器的虚拟方法?

您似乎需要一个
任何迭代器。这是一个迭代器,它执行类型擦除,将您与实际的迭代器实现隔离开来

Adobe有一个
任意迭代器的实现

Boost实现了
任何范围的

为此,可以考虑使用模板专门化而不是虚拟方法。据我所知,您有一个独特的证据类、许多不同的模型类以及创建通用工厂以从一系列证据生成所选模型的方法

#include <vector>
#include <iostream>

struct Model1 { };
struct Model2 { };
struct Evidence { };

template<class Model>
struct ModelGenerator;

template<>
struct ModelGenerator<Model1>
{
    typedef Model1 model_type;

    template<class Iterator>
    model_type generate(Iterator begin, Iterator end)
    {
        std::cout << "Generate Model1\n";
        return model_type();
    }
};

template<>
struct ModelGenerator<Model2>
{
    typedef Model2 model_type;

    template<class Iterator>
    model_type generate(Iterator begin, Iterator end)
    {
        std::cout << "Generate Model2\n";
        return model_type();
    }
};

template<class Model, class Iterator>
Model make_model(Iterator begin, Iterator end)
{
    ModelGenerator<Model> gen;
    return gen.generate(begin, end);
}
#包括
#包括
结构模型1{};
结构模型2{};
结构证据{};
模板
结构模型生成器;
模板
结构模型生成器
{
typedef model 1 model_type;
模板
模型类型生成(迭代器开始、迭代器结束)
{

std::我不能忘记
任何迭代器
的实现都很慢,所以只能在必要时使用它们。Boost.range中有
任何迭代器
。@funkybluecoffee:我不知道Boost的
任何迭代器
,当然比使用两个
任何迭代器
要好。@abarnet:ch advance、comparison、increment操作涉及一个
virtual
调用。因此开销相当大,值得一提。您应该考虑从虚拟函数中分解出所有迭代器操作。模板化函数可能会生成一个
std::vector
,并将其传递给
vir实际的
函数。这种包装器的性能成本和编程工作量可能小于
任何迭代器
/
任何范围
int main()
{
    std::vector<Evidence> v;

    Model1 m1 = make_model<Model1>(v.begin(), v.end());
    Model2 m2 = make_model<Model2>(v.begin(), v.end());
}