fork download
  1. #include <stdio.h>
  2. #include <map>
  3. #include <string>
  4.  
  5. class Base{
  6. public:
  7. virtual void sayName()=0;
  8. };
  9.  
  10. typedef std::map<std::string,Base* (*)(const char*)> CtorsMap;
  11. CtorsMap cmap;
  12.  
  13. template <class T>
  14. class CtorRegistrator{
  15. public:
  16. CtorRegistrator(const char* className)
  17. {
  18. cmap[className]=ctorWrap;
  19. }
  20. static Base* ctorWrap(const char* argName)
  21. {
  22. return new T(argName);
  23. }
  24. };
  25.  
  26. class Child1:public Base{
  27. public:
  28. Child1(const char* argName):name(argName){}
  29. void sayName()
  30. {
  31. printf("My name is %s\n",name.c_str());
  32. }
  33. protected:
  34. std::string name;
  35. static CtorRegistrator<Child1> ctorReg;
  36. };
  37.  
  38. CtorRegistrator<Child1> Child1::ctorReg("Child1");
  39.  
  40. class Child2:public Base{
  41. public:
  42. Child2(const char* argName):name(argName){}
  43. void sayName()
  44. {
  45. printf("mY nAME iS %s\n",name.c_str());
  46. }
  47. protected:
  48. std::string name;
  49. static CtorRegistrator<Child2> ctorReg;
  50. };
  51.  
  52. CtorRegistrator<Child2> Child2::ctorReg("Child2");
  53.  
  54. const char* saveFile[4][2]={
  55. {"Child1","one"},
  56. {"Child2","two"},
  57. {"Child1","eins"},
  58. {"Child2","zwei"}
  59. };
  60.  
  61. int main()
  62. {
  63. for(int i=0;i<4;++i)
  64. {
  65. cmap[saveFile[i][0]](saveFile[i][1])->sayName();
  66. }
  67. }
  68.  
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
My name is one
mY nAME iS two
My name is eins
mY nAME iS zwei