Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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++_Plugins_Factory - Fatal编程技术网

C++ c++;工厂:通过运行时加载的插件扩展寄存器

C++ c++;工厂:通过运行时加载的插件扩展寄存器,c++,plugins,factory,C++,Plugins,Factory,简而言之:我想加载一个共享库,在其中扩展工厂映射,而不必重新编译基本程序。我搜索了又搜索,但不知道如何进一步:dlopen?(但我不知道dlsym的东西)。还有别的吗? 如果我提供了我的程序所需的所有自定义库,我可以通过添加插件“重新链接”所有内容吗?如果我的代码需要boost,而用户没有boost-devel,该怎么办 详细信息:假设我有一个对象工厂代码运行良好,例如: class Voxel_Factory { public: static std::map<std::stri

简而言之:我想加载一个共享库,在其中扩展工厂映射,而不必重新编译基本程序。我搜索了又搜索,但不知道如何进一步:dlopen?(但我不知道dlsym的东西)。还有别的吗? 如果我提供了我的程序所需的所有自定义库,我可以通过添加插件“重新链接”所有内容吗?如果我的代码需要boost,而用户没有boost-devel,该怎么办

详细信息:假设我有一个对象工厂代码运行良好,例如:

class Voxel_Factory {
public:
    static std::map<std::string, boost::shared_ptr<Voxel_Factory> >* Voxel_Factories;
protected:

    static std::map<std::string, boost::shared_ptr<Voxel_Factory> >* get_map(){
        if(!Voxel_Factories){
            Voxel_Factories = new std::map<std::string, boost::shared_ptr<Voxel_Factory> >;
        }
        return Voxel_Factories;
    }
public:
    virtual boost::shared_ptr<Voxel> create_voxel(foo bar) = 0 ;
};


template<class V>
class Spe_Voxel_Factory : public Voxel_Factory {
public:
    boost::shared_ptr<Voxel> create_voxel(foo bar){
        return boost::shared_ptr<Voxel>(new V(bar));
    }
};


template<class V>
class Spe_Voxel_Register : public Spe_Voxel_Factory<V> {
public:
    Spe_Voxel_Register(const std::string &s){
        Voxel_Factory::get_map()->insert(
                std::make_pair(s,
                               boost::shared_ptr<Voxel_Factory>(new Spe_Voxel_Factory<V>) ) );
    }
};
体素在何处创建=“柯西”

欢迎任何提示或明确的参考链接。我在Linux上使用cmake,但跨平台解决方案会更好


我曾在谷歌上尝试过“c++如何在插件中扩展工厂映射”、“c++在运行时加载共享库对象工厂”,但我找不到类似的案例,尽管我是通过查看网络上的示例创建工厂的。

在Windows中,您可以使用LoadLibrary加载共享库。 加载共享库的过程开始初始化全局VAR,这意味着C++对象调用CONSCORTER。 在共享库中,可以创建类Init:

class Init
{
public:
    Init()
    {
        Spe_Voxel_Register<Voxel_Cauchy> Voxel_Cauchy::reg("cauchy");
        Spe_Voxel_Register<Voxel_Cauchy2> Voxel_Cauchy::reg("cauchy2");
            ...
    }
};

Init init1;
类初始化
{
公众:
Init()
{
Spe_体素_寄存器体素_Cauchy::reg(“Cauchy”);
Spe_体素_寄存器体素_Cauchy::reg(“cauchy2”);
...
}
};
Init init1;

提醒您的库和插件库必须用同一个编译器编译,使用相同的C/C++运行时。我在Linux上(我编辑了我的问题)。但出于兴趣,我不明白你在说什么构造函数。嗨,我添加了一个更好的解释,说明如何使用costructor来填充你的工厂

(*Voxel_Factory::Voxel_Factories)[voxel_to_create]->create_voxel(bar)
class Init
{
public:
    Init()
    {
        Spe_Voxel_Register<Voxel_Cauchy> Voxel_Cauchy::reg("cauchy");
        Spe_Voxel_Register<Voxel_Cauchy2> Voxel_Cauchy::reg("cauchy2");
            ...
    }
};

Init init1;