我正在用C ++编写一个类框架,打包成一个静态库(.lib
)。在该库中,我有一个模板类Foo
,如下所示:
template <class T> class Foo {
<T> data;
}
框架使用从文件中读取的模板类型创建Foo
的对象。理论上看起来像这样:
int
int
float
double
因此框架会加载文本文件,并根据它将实例化类Foo
四次,模板类型为int
,int
,float
, double
。
到目前为止这个工作正常。现在到了棘手的部分:客户端应用程序(使用.lib
中的框架)可以从Foo
派生自定义类,我们称之为Bar
。现在我需要在配置文本文件中允许该自定义类,如下所示:
int
int
Bar
这意味着框架应该创建两个Foo<int>
对象和一个Bar
实例。在C ++中是这样的,所以框架会动态实例化客户端应用程序定义的类吗?
如果那是不可能的,那么在C ++中适当的解决方案是什么?
答案 0 :(得分:1)
假设您为模板参数T
设置了一组固定的可能类型,例如int
,float
和double
。
然后,您可以在框架API中使用以下函数:
registerFactory(std::function<std::unique_ptr<Foo<int>>()> f);
registerFactory(std::function<std::unique_ptr<Foo<float>>()> f);
registerFactory(std::function<std::unique_ptr<Foo<double>>()> f);
客户端应用程序现在可以调用一个或多个registerFactory
函数,传递一个创建指向Foo
对象的指针的函数,例如
template<typename T> class Bar : public Foo<T> { ... };
std::unique_ptr<Foo<int>> createBar() { return std::make_unique<Bar<int>>(); }
framework.registerFactory(createBar);
框架将存储std::function
个对象,例如在std::vector
s中(每个模板参数类型一个)。
在一些init()
函数(也是框架API的一部分)上,框架将通过其配置文件并像以前一样创建Foo<>
对象,此外它将通过已注册的工厂函数并调用它们