Activator.CreateInstance for C ++?

时间:2012-07-20 13:53:59

标签: c++ .net

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

2 个答案:

答案 0 :(得分:1)

如果你不想要一个开关,你可以沿着这些线滚动你的工厂

#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;
}

通过使用某些人可能会觉得更有吸引力的宏观魔法,可以将工件添加到工厂地图中。

#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;
}

答案 1 :(得分:1)

“superfactory”最酷的C ++实现是我的好朋友Francis的一个,您可以在CodeProject上找到文章here

我相信他在写这个工厂时正是考虑到了这个需求。它还支持他的(de)序列化框架Daabli,该框架读取明文C风格(以及一些工作--JSON,XML)文件并重新创建对象图。

希望这有帮助!