如何收集满足某些概念的对象

时间:2019-05-20 23:53:45

标签: c++ variant

我有一个特定的函数,该函数应该以实例化特定模板的对象集合为参数 目前,我实现为 A

template <typename Parser, typename ParserOutput>
 bool run_parsers(const vector<Parser>& parsers, shared_ptr<vector<ParserOutput> >);

然后 B

using SemanticParsers = variant<a list of my parsers>

然后在我实例化的某个地方 C

vector<SemanticParsers> pars_vect;
factory creating and loading parsers, adding them to pars_vect
run_parsers(pars_vect, ptr_parser_outputs)

每当我要将新的解析器添加到列表中时, 我将其设置为实现A预期功能的类 编辑B向B添加新类 编辑C的注册表,该注册表知道如何创建和加载类

我怎么做却不碰B 基本上,我希望函数run_parsers接受实现特定接口但不是同一模板的类的类的集合

2 个答案:

答案 0 :(得分:0)

假设我正确理解了您的问题...

将指针/引用的容器传递给Parser,该容器实际上指向您的sublcass实例,并在Parser基类上使用虚拟方法对其进行操作。您将不需要该变体。但是,每个类可能需要一些静态代码才能将其自身添加到您的工厂中(否则它将需要了解所有解析器)。

而且-请注意,在运行时,没有类的集合,因此您的词汇有些混乱。

答案 1 :(得分:0)

我不确定为什么会有问题,如果您想避免注册一个类列表,则可能必须使用多态性,即提供接口并允许类型擦除的BaseParser类。 剩下的就是模板要解决的问题。

您的收藏集可能应该是template的模板参数。

//This is the code for regulating the frame rate
//frameInterval is a constant 25 milliseconds

sleepTime = frameInterval - (System.currentTimeMillis()-lastDraw);

try {
    if(sleepTime > 0)
        Thread.sleep(sleepTime);        
} catch (InterruptedException e1) {
    e1.printStackTrace();
}

lastDraw=System.currentTimeMillis();