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

本文共 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

你可能感兴趣的文章
中国最强的人工智能学术会议来了
查看>>
Metasploit的射频收发器功能 | Metasploit’s RF Transceiver Capabilities
查看>>
Osmocom-BB中cell_log的多种使用姿势
查看>>
主库 归档 删除策略
查看>>
linux服务器多网卡bond
查看>>
Chrome 更新策略大变:优先安装 64 位版本
查看>>
《Linux从入门到精通(第2版)》——导读
查看>>
路过下载攻击利用旧版 Android 漏洞安装勒索软件
查看>>
《ANTLR 4权威指南》——1.2 运行ANTLR并测试识别程序
查看>>
ThinkSNS 六大子版本体验及源码下载
查看>>
《Adobe Illustrator CC 2014中文版经典教程(彩色版)》—第1课1.8节复习
查看>>
《算法基础》——1.5实际因素
查看>>
《Java数字图像处理:编程技巧与应用实践》——第3章 基本Swing UI组件与图像显示 3.1 JPanel组件与BufferedImage对象的显示...
查看>>
为什么有人讨厌 Google 的新 Logo?
查看>>
2022 年 AI 会发展成什么样子,IBM 做出了 5 大预测
查看>>
esnext —— 将 ES6 转成 JavaScript 代码
查看>>
java多线程之线程间通信
查看>>
Linux: chmod 更改文件的权限
查看>>
【C语言】给定两个整型变量的值,将两个值的内容进行交换(不同方法)
查看>>
Android Studio导入Eclipse项目
查看>>