AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
## 反射器实现 C++语言没有java和go的反射机制,想要实现需要用将定义类注册到map中存储起来,待到需要用时,直接根绝类名从map中获取实例。C++最常见的是用宏定义实现,但很多基本用宏实现的版本理解起来非常困难,所以我用较少宏实现C++的反射功能,代码如下: ``` /** * @brief C++反射器 */ #ifndef _REFLECTOR_H_ #define _REFLECTOR_H_ #include <iostream> #include <unordered_map> #include <memory> #include <functional> namespace even { class Reflector { public: typedef std::function<void*()> Func; void* CreateObject(const std::string& name) { if (mapFunction_.count(name)) return mapFunction_[name](); return nullptr; } void Regist(const std::string& name, Func&& func) { mapFunction_[name] = func; } static Reflector& Instance() { static Reflector instance; return instance; } private: Reflector() {} std::unordered_map<std::string, Func> mapFunction_; }; class Register { public: typedef std::function<void*()> Func; Register(const std::string& name, Func&& func) { Reflector::Instance().Regist(name, std::forward<Func>(func)); } }; /** * 抽象基类不能注册 */ #define REGISTER(class_name) \ Register g_register_##class_name(#class_name, []() { \ return new class_name(); \ }); } #endif ``` ## 反射器运用 常用的反射功能一般为根据类名直接创建实例,返回基类的指针,这样可以不用写很多 if 和 else 根据类名创建不同实例的判断,而且后期加入其它派生类也不用修改代码,非常方便且易于维护,特别是服务器实现 RPC 的功能反射机制非常有用。 运用如下: ``` #include "reflector.h" using namespace even; class Base { public: explicit Base() = default; virtual void Print() { std::cout << "Base" << std::endl; } }; REGISTER(Base); // 注册 class DeriveA : public Base { public: void Print() override { std::cout << "DeriveA" << std::endl; } }; REGISTER(DeriveA); // 注册 class DeriveB : public Base { public: void Print() override { std::cout << "DeriveB" << std::endl; } }; REGISTER(DeriveB); // 注册 /** * 实例创建宏,返回基类指针,相当于new的作用,需要自己回收 */ #define BASE_CREATE(name) reinterpret_cast<Base*>(Reflector::Instance().CreateObject(name)) int main() { std::shared_ptr<Base> p1(BASE_CREATE("Base")); p1->Print(); std::shared_ptr<Base> p2(BASE_CREATE("DeriveA")); p2->Print(); std::shared_ptr<Base> p3(BASE_CREATE("DeriveB")); p3->Print(); return 0; } ``` 运行结果如下: ``` Base DeriveA DeriveB ```