Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在运行期间使用c+动态注册工厂类中的类+;_C++_C++11_Cmake_Factory Pattern - Fatal编程技术网

C++ 如何在运行期间使用c+动态注册工厂类中的类+;

C++ 如何在运行期间使用c+动态注册工厂类中的类+;,c++,c++11,cmake,factory-pattern,C++,C++11,Cmake,Factory Pattern,现在,我实现了一个factory类来动态创建带有标识字符串的类,请参见以下代码: void IOFactory::registerIO() { Register("NDAM9020", []() -> IOBase * { return new NDAM9020(); }); Register("BK5120", []() -> IOBase * { return new BK5120(); }); } std::u

现在,我实现了一个factory类来动态创建带有标识字符串的类,请参见以下代码:

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组件,我们应该在registerIO函数中添加另一个寄存器代码,然后重新编译整个项目。所以我想知道是否可以在运行时从配置文件(见下文)动态注册类

io_factory.conf
------------------
NDAM9020:NDAM9020
BK5120:BK5120
------------------
第一个是标识名,第二个是类名

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


更新:

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

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

我应该提到的是,在运行时注册类并不是必须的,若有办法在编译期间注册,也可以。我想要的只是在注册另一个类时避免重新编译

所以我想知道是否可以在运行时从配置文件(见下文)动态注册类

io_factory.conf
------------------
NDAM9020:NDAM9020
BK5120:BK5120
------------------
< C++ 20】C++没有反射特征允许它。但是,您可以通过在配置文件中生成一个简单的C++实现文件来编译它。 如何在运行期间使用c在工厂类中动态注册类++

阅读更多关于C++,至少是一个好的网站,然后是C++11标准也读取C++编译器的文档(也许或),如果你有一个,你的.如果操作系统中有可能您可以在运行时注册工厂函数(在加载提供工厂函数的插件后引用该函数)。例如,浏览器或最新的编译器(例如启用)或shell正在执行此操作

所以我想知道是否可以在运行时从配置文件(见下文)动态注册类

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

大多数C++程序都是在Linux下运行的。strong>某些操作系统提供了一种机制。对于Linux,请参阅、和。对于Windows,请跳入

这样,通过最近的C++实现和一些最近的操作系统,YOU可以在运行时登记工厂类(使用插件),并且您可以找到库(例如)来帮助您。 <>但是,<>强>纯标准C++,集合是静态已知的,插件不存在。因此,给定程序中的函数或类集是有限的,不会随时间而改变。

纯C++中,有效函数指针的集合,或给定变量的有效可能值集是有限的。其他的都可以。在实践中,许多现实的C++程序通过操作系统或JIT编译库接受插件。 当然,你可以考虑使用诸如OR或.*之类的库。strong>它们是特定于实现的,因此您的代码不可移植

在Linux上,很多或应用程序(例如,大多数Web浏览器,例如,或Firefox)都用C++编码,并用工厂函数加载插件。与和核对

<微软>被称为C++代码,可能接受插件。 我尝试过使用宏,但宏中的参数不能是字符串

可以使用宏参数。你可以耍花招

我想要的只是在注册另一个类时避免重新编译

在Ubuntu上,我建议您接受程序或库中的插件 与绝对文件路径一起使用;插件通常会作为程序选项(如DO或like)传递,并在程序或库初始化时
dlopen
-ed。实际上,你可以有很多插件(成千上万的插件,请参阅或查看)。插件中的-ED C++函数应该声明为代码>外部“C”<代码>禁用。 <一个单一的C++文件插件(在<代码> ueluxin .cc>代码>)可以编译为“代码> g++-墙壁-oG-gfp-共享您的插件。cc/o您的插件。至
dlopen
)。也要注意

也考虑(至少升级了GCC之后,也许是通过编译它的源代码)(它比在一些文件中生成临时C++代码更快,并将该文件编译成临时插件)。 为了便于调试加载的插件,您可能会对Ian Taylor的感兴趣

请注意,您的程序的全局符号(声明为
extern“C”
)可以通过将
nullptr
文件路径传递到,然后在获得的句柄上使用来按名称访问。链接程序(或应用程序)时,您希望传递
-rdynamic-ldl

我想要的只是在注册另一个类时避免重新编译

您可以在不同的翻译单元(大概是一个简短的翻译单元)中注册类。您可以从它的
生成的/rps name.hh
文件中获得灵感。然后您只需重新编译一个
*.cc
文件,并重新链接整个程序或库。请注意,在中也有类似的技巧,我建议从中汲取灵感


还可以阅读J.Pitrat的《人工存在:有意识机器的良知》一书ISBN,该书解释了元编程方法为何有用。学习源代码(或),使用或接受灵感,(当它们都产生C++代码)时,相关的

< P>你似乎要求的动力比你实际需要的要多。你想避免工厂自己不得不