#include <stdio.h>
#include <map>
#include <string>
class Base{
public:
virtual void sayName()=0;
};
typedef std::map<std::string,Base* (*)(const char*)> CtorsMap;
CtorsMap cmap;
template <class T>
class CtorRegistrator{
public:
CtorRegistrator(const char* className)
{
cmap[className]=ctorWrap;
}
static Base* ctorWrap(const char* argName)
{
return new T(argName);
}
};
class Child1:public Base{
public:
Child1(const char* argName):name(argName){}
void sayName()
{
printf("My name is %s\n",name.c_str());
}
protected:
std::string name;
static CtorRegistrator<Child1> ctorReg;
};
CtorRegistrator<Child1> Child1::ctorReg("Child1");
class Child2:public Base{
public:
Child2(const char* argName):name(argName){}
void sayName()
{
printf("mY nAME iS %s\n",name.c_str());
}
protected:
std::string name;
static CtorRegistrator<Child2> ctorReg;
};
CtorRegistrator<Child2> Child2::ctorReg("Child2");
const char* saveFile[4][2]={
{"Child1","one"},
{"Child2","two"},
{"Child1","eins"},
{"Child2","zwei"}
};
int main()
{
for(int i=0;i<4;++i)
{
cmap[saveFile[i][0]](saveFile[i][1])->sayName();
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxzdHJpbmc+CgpjbGFzcyBCYXNlewpwdWJsaWM6CiAgdmlydHVhbCB2b2lkIHNheU5hbWUoKT0wOwp9OwoKdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZyxCYXNlKiAoKikoY29uc3QgY2hhciopPiBDdG9yc01hcDsKQ3RvcnNNYXAgY21hcDsKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBDdG9yUmVnaXN0cmF0b3J7CnB1YmxpYzoKICBDdG9yUmVnaXN0cmF0b3IoY29uc3QgY2hhciogY2xhc3NOYW1lKQogIHsKICAgIGNtYXBbY2xhc3NOYW1lXT1jdG9yV3JhcDsKICB9CiAgc3RhdGljIEJhc2UqIGN0b3JXcmFwKGNvbnN0IGNoYXIqIGFyZ05hbWUpCiAgewogICAgcmV0dXJuIG5ldyBUKGFyZ05hbWUpOwogIH0KfTsKCmNsYXNzIENoaWxkMTpwdWJsaWMgQmFzZXsKcHVibGljOgogIENoaWxkMShjb25zdCBjaGFyKiBhcmdOYW1lKTpuYW1lKGFyZ05hbWUpe30KICB2b2lkIHNheU5hbWUoKQogIHsKICAgIHByaW50ZigiTXkgbmFtZSBpcyAlc1xuIixuYW1lLmNfc3RyKCkpOwogIH0KcHJvdGVjdGVkOgogIHN0ZDo6c3RyaW5nIG5hbWU7CiAgc3RhdGljIEN0b3JSZWdpc3RyYXRvcjxDaGlsZDE+IGN0b3JSZWc7Cn07CgpDdG9yUmVnaXN0cmF0b3I8Q2hpbGQxPiBDaGlsZDE6OmN0b3JSZWcoIkNoaWxkMSIpOwoKY2xhc3MgQ2hpbGQyOnB1YmxpYyBCYXNlewpwdWJsaWM6CiAgQ2hpbGQyKGNvbnN0IGNoYXIqIGFyZ05hbWUpOm5hbWUoYXJnTmFtZSl7fQogIHZvaWQgc2F5TmFtZSgpCiAgewogICAgcHJpbnRmKCJtWSBuQU1FIGlTICVzXG4iLG5hbWUuY19zdHIoKSk7CiAgfQpwcm90ZWN0ZWQ6CiAgc3RkOjpzdHJpbmcgbmFtZTsKICBzdGF0aWMgQ3RvclJlZ2lzdHJhdG9yPENoaWxkMj4gY3RvclJlZzsKfTsKCkN0b3JSZWdpc3RyYXRvcjxDaGlsZDI+IENoaWxkMjo6Y3RvclJlZygiQ2hpbGQyIik7Cgpjb25zdCBjaGFyKiBzYXZlRmlsZVs0XVsyXT17CiAgeyJDaGlsZDEiLCJvbmUifSwKICB7IkNoaWxkMiIsInR3byJ9LAogIHsiQ2hpbGQxIiwiZWlucyJ9LAogIHsiQ2hpbGQyIiwiendlaSJ9Cn07CgppbnQgbWFpbigpCnsKICBmb3IoaW50IGk9MDtpPDQ7KytpKQogIHsKICAgIGNtYXBbc2F2ZUZpbGVbaV1bMF1dKHNhdmVGaWxlW2ldWzFdKS0+c2F5TmFtZSgpOwogIH0KfQo=