我有一个特定的函数,该函数应该以实例化特定模板的对象集合为参数 目前,我实现为 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接受实现特定接口但不是同一模板的类的类的集合
答案 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();