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