有没有办法在C++中动态实例化"custom"类

Is there a way dynamically instantiate a "custom" class in C++

本文关键字:实例化 custom 动态 C++ 有没有      更新时间:2023-10-16

我正在用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++的适当解决方案是什么?

假设模板参数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::vectors 为单位(每个模板参数类型一个)。 在某些init()函数(也是框架 API 的一部分)上,框架将像以前一样遍历其配置文件并创建Foo<>对象,此外,它还会遍历注册的工厂函数并调用它们。