Activator.CreateInstance for C++?

Activator.CreateInstance for C++?

本文关键字:C++ for CreateInstance Activator      更新时间:2023-10-16

在我的.NET项目中,我有一些代码可以根据xml创建新对象。激活器是实现这一目标的核心。在c++中,我能做类似的事情吗?我发现了一些IOC/DI框架,但我真的不需要太多功能。当然,另一种选择是简单地编写一个开关,但每次我提出一个新类型时,都需要修改它(以及XML)。

"超级工厂"最酷的C++实现是我的好朋友Francis的一个,你可以在CodeProject上找到这篇文章。

我相信他写这家工厂正是出于这种需要。它还支持他的(反)序列化框架Daabli,该框架读取纯文本C风格(以及一些工作-JSON、XML)文件并重新创建对象图。

希望这能有所帮助!

如果你不想要一个开关,你可以把你的工厂沿着的路线

#include <map>
#include <string>
class IHasCreate
{
};
typedef IHasCreate* (*CreateFunc)();
std::map<std::string,CreateFunc> factorymap;

class foo : IHasCreate
{
public:
    static IHasCreate* CreateFoo()
    {
        return new foo();
    }
};
class bar: IHasCreate
{
    public:
    static IHasCreate* CreateBar()
    {
        return new bar();
    }
};
IHasCreate* FactoryCreate( const std::string & name )
{
    return factorymap[name]();
}
int main()
{
    factorymap["foo"] = &foo::CreateFoo;
    factorymap["bar"] = &bar::CreateBar;

    IHasCreate *fooboject =  FactoryCreate("foo");
    IHasCreate *barboject =  FactoryCreate("bar");
    return 0;
}

向factorymap添加内容可以通过使用某种宏魔术来完成,有些人可能会觉得这种魔术更具吸引力。

#include <map>
#include <string>
class IHasCreate
{
};
typedef IHasCreate* (*CreateFunc)();
std::map<std::string,CreateFunc> factorymap;
bool RegisterType( const std::string& type , CreateFunc func )
{
    factorymap[type] = func;
    return true;
}
IHasCreate* FactoryCreate( const std::string & name )
{
    return factorymap[name]();
}
#define REGISTER(type)  
IHasCreate* type##createfunc() { return new type(); } 
bool type##temp = RegisterType( #type , &type##createfunc); 

class foo : public IHasCreate
{
};
REGISTER(foo);
class bar: public IHasCreate
{
};
REGISTER(bar);
int main()
{
    IHasCreate *fooboject =  FactoryCreate("foo");
    IHasCreate *barboject =  FactoryCreate("bar");
    return 0;
}