如何优雅地实现 C++ 编译期静态反射 https://mp.weixin.qq.com/s/y1GULGBR-ktn-2N1fJ8CDw
文章讲得不错。
提取一下重点:使用T t = {。。。};语法可以提取出结构体T的成员数量。
原理:当{。。。}里面给的初始化值个数小于等于T的成员数量时,初始化语法成立。
如果初始化值个数超过T的成员数量时,初始化语法不成立,会编译报错。
据此,使用SFINAE机制就可以获得成员数量啦。
不过,这个文章还不是最优解。BOOST1.75刚刚出炉了PFR库:
Basic reflection without macro or boilerplate code for user defined types, from Antony Polukhin.
完全不需要用户做任何事情就获得了反射。
提取一下重点:知道了成员数量,就可以使用结构化绑定 auto [。。。] = T();语法提取出每一个成员的类型啦。
不过,C++没有办法自动创建不定数量的变量名,所以,PFR库只能预先硬编码了最多支持100个成员的信息提取
打开boost\pfr\detail\core17_generated.hpp看一下就知道啦。
当然了,这一步可以使用boost::preprocess库来自动化,就是能让这个文件更短点,看起来更“酷”点,并无实质收益。
具体要处理的细节当然还非常非常多,不过,核心就这么些了。