有没有办法在C++中动态实例化"custom"类
Is there a way dynamically instantiate a "custom" class in C++
我正在用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++的适当解决方案是什么?
假设模板参数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<>
对象,此外,它还会遍历注册的工厂函数并调用它们。
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 受约束的成员函数和显式模板实例化
- 对显式实例化的模板函数的未定义引用
- 有没有办法在C++中动态实例化"custom"类