-6ren">
gpt4 book ai didi

c++ - 如何在运行时使用c++在工厂类中动态注册类

转载 作者:行者123 更新时间:2023-12-01 14:36:43 25 4
gpt4 key购买 nike

现在,我实现了一个工厂类来动态创建带有标识字符串的类,请看下面的代码:

void IOFactory::registerIO()
{
Register("NDAM9020", []() -> IOBase * {
return new NDAM9020();
});

Register("BK5120", []() -> IOBase * {
return new BK5120();
});
}

std::unique_ptr<IOBase> IOFactory::createIO(std::string ioDeviceName)
{
std::unique_ptr<IOBase> io = createObject(ioDeviceName);
return io;
}

因此我们可以使用注册的名称创建 IO 类:

IOFactory ioFactory;
auto io = ioFactory.createIO("BK5120");

这种方法的问题是,如果我们再添加一个IO组件,我们应该在registerIO函数中再添加一个注册代码,然后重新编译整个工程。所以我想知道我是否可以在运行时从配置文件(见下文)动态注册类。

io_factory.conf
------------------
NDAM9020:NDAM9020
BK5120:BK5120
------------------

第一个是标识名,第二个是类名。

我试过使用宏,但是宏中的参数不能是字符串。所以我想知道是否还有其他方法。感谢您的提前。


更新:

没想到有这么多评论和回复,谢谢大家,抱歉回复晚了。

我们当前的操作系统是 Ubuntu16.04,我们使用内置编译器 gcc/g++5.4.0,我们使用 CMake 来管理构建。

而且我要提一下,我不是必须在运行期注册类,如果有办法在编译期注册也可以。我想要的只是避免在我想注册另一个类时重新编译。

最佳答案

So I was wondering if I could dynamically register class from a configure file(see below) at runtime.

没有。从 C++20 开始,C++ 没有允许它的反射特性。但是您可以在编译时通过从您的配置文件生成一个简单的 C++ 实现文件来完成。

关于c++ - 如何在运行时使用c++在工厂类中动态注册类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62258839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com