今天在翻阅 joplin 笔记的时候,发现老早收藏的一篇关于 cpp 反射实现的文章,今天认真的来读一读。
[toc]
☸ 1 预报知识补充
✡ 1.1 define宏定义中的#,##,@#及/符号
#
(stringizing)字符串化操作符- 将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串
#define example1(instr) #instr
string str=example1(abc); 将会展成:string str="abc";
##
(token-pasting)符号连接操作符- 作用是将宏定义的多个形参成一个实际参数名
#define exampleNum(n) num##n
int num=exampleNum(9); 将会扩展成 int num=num9
- 如果##后的参数本身也是一个宏的话,##会阻止这个宏的展开
@#
(charizing)字符化操作符- 只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。作用是将传的单字符参数名转换成字符,以一对单引用括起来
#define makechar(x) #@x
a = makechar(b);
展开后变成了:a= 'b';
/
行继续操作符
☸ 2 实现
实现就不放在这里了,参考链接中的实现是可用的,直接照搬都能调通
☸ 3 理解与结构
这个实现的本质是用模版函数和宏实现了一个类管理器
通过 设计模式中的 AbstractFactory 抽象工厂 实现对象的创建