#include #include #include #define CLASS MyClass #define CLASS_MAP ClassMap::get_class_map() #define DEFINE_CLASS(class_type, class_name) class_type(std::string) { CLASS_MAP.regist_class(#class_name, class_type::class_name); } class_type() {} static class_type self; static CLASS* class_name() { return new class_type(); } #define REGIST_CLASS(class_type) class_type class_type::self(#class_type); template class ClassMap { typedef T* (*ClassType)(); public: static ClassMap& get_class_map() { static ClassMap class_map; return class_map; } private: std::map class_map; public: void regist_class(const std::string class_name, const ClassType class_type) { this->class_map.insert(std::map::value_type(class_name, class_type)); } T* get_class(const std::string class_name) { std::map::ClassType>::template iterator it = this->class_map.find(class_name); return (it != this->class_map.end()) ? it->second(): nullptr; } }; class MyClass { public: DEFINE_CLASS(MyClass, my_class) public: virtual void xxx() const { std::cout << "xxx" << std::endl; } }; REGIST_CLASS(MyClass) int main() { MyClass* a = CLASS_MAP.get_class("my_class"); if (a) { a->xxx(); } else { std::cout << "my_class 未发现!" << std::endl; } MyClass* b = CLASS_MAP.get_class("undefined_class"); if (b) { b->xxx(); } else { std::cout << "undefined_class 未发现!" << std::endl; } return 0; }
运行结果:
xxx undefined_class 未发现!
上一篇 Linux基础命令与shell脚本的简单使用
下一篇 C语言力扣第23题之合并K个升序序列链表。四种方法
版权所有 (c)2021-2022 MSHXW.COM
ICP备案号:晋ICP备2021003244-6号