fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <unordered_map>
  4. #include <memory>
  5.  
  6. struct IBase
  7. {
  8. virtual ~IBase() = default;
  9. virtual void dosmth() const = 0;
  10. };
  11.  
  12. struct SomeClass1 : public IBase
  13. {
  14. int i;
  15.  
  16. SomeClass1() : i(33) {}
  17. SomeClass1(int h) : i(h) {}
  18.  
  19. void dosmth() const override { std::cout << "SomeClass1: " << i << "\n"; };
  20. };
  21.  
  22. struct SomeClass2 : public IBase
  23. {
  24. int d;
  25.  
  26. SomeClass2() : d(43) {}
  27. SomeClass2(int s) : d(s) {}
  28.  
  29. void dosmth() const override { std::cout << "SomeClass2: " << d << "\n"; };
  30. };
  31.  
  32. void func1()
  33. {
  34. std::cout << "hello!\n";
  35. }
  36. void func2()
  37. {
  38. std::cout << "bye!\n";
  39. }
  40.  
  41. struct ClassInfoBase
  42. {
  43. std::function<void()> SomeFunction;
  44.  
  45. virtual std::unique_ptr<IBase> createInstance() const = 0;
  46. virtual std::unique_ptr<IBase> createInstance(int p) const = 0;
  47. };
  48.  
  49. template<class T>
  50. struct ClassInfo : public ClassInfoBase
  51. {
  52. std::unique_ptr<IBase> createInstance() const override
  53. {
  54. return std::make_unique<T>();
  55. }
  56. std::unique_ptr<IBase> createInstance(int p) const override
  57. {
  58. return std::make_unique<T>(p);
  59. }
  60. };
  61.  
  62. struct Mapper
  63. {
  64. std::unordered_map<std::string, std::unique_ptr<ClassInfoBase>> Mappings;
  65.  
  66. template<class Class, class Function>
  67. void registerClass(const std::string &name, Function f)
  68. {
  69. auto info = std::make_unique<ClassInfo<Class>>();
  70. info->SomeFunction = std::move(f);
  71. Mappings[name] = std::move(info);
  72. }
  73. };
  74.  
  75. int main()
  76. {
  77. Mapper m;
  78.  
  79. //register some classes at startup
  80. m.registerClass<SomeClass1>("SomeClass1", func1);
  81. m.registerClass<SomeClass2>("SomeClass2", func2);
  82.  
  83.  
  84. //create instances by name (or enum)
  85. auto instance1 = m.Mappings["SomeClass1"]->createInstance();
  86. auto instance2 = m.Mappings["SomeClass1"]->createInstance(2);
  87. auto instance3 = m.Mappings["SomeClass2"]->createInstance();
  88. auto instance4 = m.Mappings["SomeClass2"]->createInstance(8);
  89.  
  90. m.Mappings["SomeClass1"]->SomeFunction();
  91. instance1->dosmth();
  92. instance2->dosmth();
  93. instance3->dosmth();
  94. instance4->dosmth();
  95. m.Mappings["SomeClass2"]->SomeFunction();
  96. }
Success #stdin #stdout 0s 15248KB
stdin
Standard input is empty
stdout
hello!
SomeClass1: 33
SomeClass1: 2
SomeClass2: 43
SomeClass2: 8
bye!