有没有办法在C ++中动态实例化“自定义”类

时间:2016-11-25 23:03:12

标签: c++

我正在用C ++编写一个类框架,打包成一个静态库(.lib)。在该库中,我有一个模板类Foo,如下所示:

template <class T> class Foo {
    <T> data;
}

框架使用从文件中读取的模板类型创建Foo的对象。理论上看起来像这样:

int
int
float
double

因此框架会加载文本文件,并根据它将实例化类Foo四次,模板类型为intintfloatdouble

到目前为止这个工作正常。现在到了棘手的部分:客户端应用程序(使用.lib中的框架)可以从Foo派生自定义类,我们称之为Bar。现在我需要在配置文本文件中允许该自定义类,如下所示:

int
int
Bar

这意味着框架应该创建两个Foo<int>对象和一个Bar实例。在C ++中是这样的,所以框架会动态实例化客户端应用程序定义的类吗?

如果那是不可能的,那么在C ++中适当的解决方案是什么?

1 个答案:

答案 0 :(得分:1)

假设您为模板参数T设置了一组固定的可能类型,例如intfloatdouble

然后,您可以在框架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<>对象,此外它将通过已注册的工厂函数并调用它们