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 ClassProperty15 {16 private:17 typedef void* (Object::*Func)(void*);18 public:19 ClassProperty() :func(nullptr), desc(nullptr) {}20 template21 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 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 R invoke(Object* obj, Args&&... args)const36 {37 typedef R(Object::*ObjFunc)(Args...);38 ObjFunc mf = (ObjFunc)func;39 return (obj->*mf)(std::forward (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(obj, 2);6 std::cout << ret << std::endl;7 prop++;8 }9 delete obj;
3.结果
getIntValue
2
这里实现的反射功能还是很简单,没有对输入参数,输出参数类型进行判断,反射仅实现了简单函数的功能,没有成员变量,静态函数,以及复杂参数等功能。