Guest User

Untitled

a guest
Feb 18th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.17 KB | None | 0 0
  1.  
  2. template<typename T_base>
  3. class class_string_map {
  4.     protected:
  5.         class Entry {
  6.             public:
  7.                 Entry(const std::string& name, T_base* (*func)()){
  8.                     Name = name;
  9.                     Instantiate = func;
  10.                 }
  11.                 virtual ~Entry(){};
  12.                 T_base* (*Instantiate)();
  13.                 std::string Name;
  14.         };
  15.         class Manager {
  16.             public:
  17.                 std::vector<Entry*> Classes;
  18.  
  19.                 static Manager& Get() {
  20.                     static Manager m;
  21.                     return m;
  22.                 }
  23.         };
  24.  
  25.     public:
  26.         template<typename T_sub>
  27.         static void Register(const std::string& name){
  28.             Manager::Get().Classes.push_back(new Entry(name, []() -> T_base* {return new T_sub;}));
  29.         }
  30.  
  31.         static T_base* Instantiate(const std::string& name){
  32.             for(Entry* e: Manager::Get().Classes)
  33.                 if(e->Name == name)
  34.                     return e->Instantiate();
  35.  
  36.             return 0;
  37.         }
  38. };
  39.  
  40. class TestBase {
  41.     public:
  42.         virtual ~TestBase(){};
  43.         virtual void Test(){
  44.             print("Hi, I'm mister base class.");
  45.         }
  46. };
  47.  
  48. class TestSub: public TestBase {
  49.     public:
  50.         void Test(){
  51.             print("Hi. :D");
  52.         }
  53. };
  54.  
  55.  
  56. int main() {
  57.     typedef class_string_map<TestBase> test;
  58.     test::Register<TestSub>("Test_Sub");
  59.     TestBase* t = test::Instantiate("Test_Sub");
  60.     t->Test();
  61.     return 0;
  62. }
Add Comment
Please, Sign In to add comment