手动实现一个cpp反射

今天在翻阅 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 抽象工厂 实现对象的创建

参考链接

c++实现反射