反射(一)
C++不像C#,java那样天生编译过程实现反射功能,只能在代码层面注册来实现。比如QT,UE等,为了实现反射功能,提供了特殊的宏定义,并且使用工具将宏生成相应的C++代码实现反射功能的。
1.定义
1 class ClassProperty; 2 class Object 3 { 4 public: 5 int getIntValue(int i) { return i + 1; } 6 public: 7 virtual const ClassProperty* getProperty() 8 { 9 return GetClassPropertys(); 10 } 11 public: 12 static const ClassProperty* GetClassPropertys(); 13 }; 14 struct ClassProperty 15 { 16 private: 17 typedef void* (Object::*Func)(void*); 18 public: 19 ClassProperty() :func(nullptr), desc(nullptr) {} 20 template<typename R, typename C, typename... Args> 21 ClassProperty(R(C::*funcc)(Args...)const = 0, const char* desc = 0) : 22 desc(desc) 23 { 24 typedef R(Object::*ObjFunc)(Args...); 25 func = (Func)(ObjFunc)funcc; 26 } 27 template<typename R, typename C, typename... Args> 28 ClassProperty(R(C::*funcc)(Args...) = 0, const char* desc = 0) : 29 desc(desc) 30 { 31 typedef R(Object::*ObjFunc)(Args...); 32 func = (Func)(ObjFunc)funcc; 33 } 34 public: 35 template<typename R, typename ...Args>R invoke(Object* obj, Args&&... args)const 36 { 37 typedef R(Object::*ObjFunc)(Args...); 38 ObjFunc mf = (ObjFunc)func; 39 return (obj->*mf)(std::forward<Args>(args)...); 40 } 41 Func func; 42 const char* desc; 43 }; 44 const ClassProperty* Object::GetClassPropertys() 45 { 46 const static ClassProperty prop[] = { { &Object::getIntValue,"getIntValue" },ClassProperty() }; 47 return prop; 48 }
2.使用
1 Object* obj = new Object(); 2 const ClassProperty* prop = obj->getProperty(); 3 while (prop->func != nullptr) { 4 std::cout << prop->desc << std::endl; 5 int ret = prop->invoke<int, int>(obj, 2); 6 std::cout << ret << std::endl; 7 prop++; 8 } 9 delete obj;
3.结果
getIntValue
2
这里实现的反射功能还是很简单,没有对输入参数,输出参数类型进行判断,反射仅实现了简单函数的功能,没有成员变量,静态函数,以及复杂参数等功能。