C++实现反射机制
C++中反射机制的实现
简单理解:只根据类的名字(字符串)创建类的实例。
事实:C++并没有直接从语言上提供反射机制给我们用,不过无所不能的C++可以通过一些trick来实现反射。
好处:代码精简,提高易用性
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#include <iostream>
#include <map> #include <memory> #include <functional> using FUNC = std::function<void *(void)>; using namespace std; class Reflector { private: map<std::string, FUNC> objectMap; static shared_ptr<Reflector> ptr; public: void *CreateObject(const string &str) { for (auto &x : objectMap) { if(x.first == str) return x.second(); } return nullptr; } void Register(const string &class_name, FUNC &&generator) { objectMap[class_name] = generator; } static shared_ptr<Reflector> Instance() { if(ptr == nullptr) { ptr.reset(new Reflector()); } return ptr; } }; shared_ptr<Reflector> Reflector::ptr = nullptr; class RegisterAction { public: RegisterAction(const string &class_name, FUNC &&generator) { Reflector::Instance()->Register(class_name, forward<FUNC>(generator)); } }; |
解读:只要注册好,啥都可以造!
1、单例类
2、对象映射表:key-类字符串,value-类无参构造函数指针
3、提前调用Register注册
4、调用CreateObject获取类构造函数指针,从而构造对象
希望大家能把自己的所学和他人一起分享,不要去鄙视别人索取时的贪婪,因为最应该被鄙视的是不肯分享时的吝啬。