Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- template<typename T_base>
- class class_string_map {
- protected:
- class Entry {
- public:
- Entry(const std::string& name, T_base* (*func)()){
- Name = name;
- Instantiate = func;
- }
- virtual ~Entry(){};
- T_base* (*Instantiate)();
- std::string Name;
- };
- class Manager {
- public:
- std::vector<Entry*> Classes;
- static Manager& Get() {
- static Manager m;
- return m;
- }
- };
- public:
- template<typename T_sub>
- static void Register(const std::string& name){
- Manager::Get().Classes.push_back(new Entry(name, []() -> T_base* {return new T_sub;}));
- }
- static T_base* Instantiate(const std::string& name){
- for(Entry* e: Manager::Get().Classes)
- if(e->Name == name)
- return e->Instantiate();
- return 0;
- }
- };
- class TestBase {
- public:
- virtual ~TestBase(){};
- virtual void Test(){
- print("Hi, I'm mister base class.");
- }
- };
- class TestSub: public TestBase {
- public:
- void Test(){
- print("Hi. :D");
- }
- };
- int main() {
- typedef class_string_map<TestBase> test;
- test::Register<TestSub>("Test_Sub");
- TestBase* t = test::Instantiate("Test_Sub");
- t->Test();
- return 0;
- }
Add Comment
Please, Sign In to add comment