1、直接看代码
//C++ reflection #pragma once #include #include #define REFLECTION_REGISTER(className) className* objectCreator##className(){ return new className; }; ClassRegister g_creatorRegister##className( #className,(CreateObjectPtrFuc)objectCreator##className) typedef void* (*CreateObjectPtrFuc)(void); class ClassCreator { public: void* getClassByName(std::string className); void registClass(std::string name, CreateObjectPtrFuc method); static ClassCreator& getInstance(); private: std::map m_classMap; ClassCreator() {}; }; ClassCreator& ClassCreator::getInstance() { static ClassCreator sLo_factory; return sLo_factory; } void* ClassCreator::getClassByName(std::string className) { auto iter = m_classMap.find(className); if (iter == m_classMap.end()) return NULL; else return iter->second(); } void ClassCreator::registClass(std::string name, CreateObjectPtrFuc method) { m_classMap.insert(make_pair(name, method)); } class ClassRegister { public: ClassRegister(std::string className, CreateObjectPtrFuc ptrCreateFn) { ClassCreator::getInstance().registClass(className, ptrCreateFn); } }; //for ex: class TestClassA { public: void test() { printf("hello TestClassAn"); }; }; //call REFLECTION_REGISTER register class into reflection creator REFLECTION_REGISTER(TestClassA); //usage //(TestClassA*)ClassFactory::getInstance().getClassByName("TestClassA")
2、实现原理
ClassCreator里的map保存各个类的create函数,定义在REFLECTION_REGISTER宏里,这个宏还有个值得注意的点就是声明一个全局变量ClassRegister,利用ClassRegister的构造函数调用类创建函数的注册。
3、应用思考
可以用子类父类的方式,需要用反射创建的类都继承某父类,然后可以用配置文件的方式灵活的实现一些功能。
上一篇 springboot +zookeeper+dubbo
下一篇 让MFC支持CLR
版权所有 (c)2021-2022 MSHXW.COM
ICP备案号:晋ICP备2021003244-6号