博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
反射(一)
阅读量:6689 次
发布时间:2019-06-25

本文共 1943 字,大约阅读时间需要 6 分钟。

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     template
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
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

   这里实现的反射功能还是很简单,没有对输入参数,输出参数类型进行判断,反射仅实现了简单函数的功能,没有成员变量,静态函数,以及复杂参数等功能。

转载于:https://www.cnblogs.com/goooon/p/5650660.html

你可能感兴趣的文章
查询进程并杀死
查看>>
VMXNET3 vs E1000E and E1000
查看>>
7200的GRE(隧道)+ipsec(传输模式+pre-share)配置
查看>>
四、编译安装php-5.5.34
查看>>
Thinkpad X240修改bios引导,U盘安装系统
查看>>
Slave SQL: Relay log read failure: Could not parse relay log event entry.
查看>>
抽取Zabbix的图形整合到自己后台
查看>>
Linux输入子系统
查看>>
大数据_JAVA_第二天_进制转化和补码存储方式
查看>>
linux下oracle 11g dg环境搭建
查看>>
laravel安装intervention/image图像处理扩展 报错fileinfo is missing
查看>>
Jenkins(2)
查看>>
满血回归
查看>>
利用ARP欺骗另一台电脑并偷窥
查看>>
第一周作业
查看>>
Web应用的工作原理
查看>>
Python和Java就业前景对比
查看>>
Python学习笔记__9章 IO编程
查看>>
Python学习笔记__20.1章 协程
查看>>
第六章 总结
查看>>