用于位域结构的C ++“反射”

时间:2018-06-21 15:07:58

标签: c++ reflection bit-fields

我正在寻找一种在C ++中对像这样的位域结构进行“反射”的方法:

 struct Bits {
    uint32_t opCode : 5;
    uint32_t header : 3;
    uint32_t source : 5;
    uint32_t destination : 5;
    uint32_t offset : 13;
 };

我的目标是能够得到类似的东西

  1. 所有成员名称均为std :: string list ex。 “ opCode”,“ header”等...
  2. 基础类型名,例如std :: string。 “ uint32_t”
  3. 每个字段的位数,例如std :: int列表。 5,3,5,5,13

带有最小手动编码,宏或样板代码。这些值原则上应该能够在编译时确定,尽管不是必须的。

通读this StackOverflow post之后,很明显标准C ++之外的库提供了一些“反射”功能。调查诸如Precise and Flat ReflectionPonderBoost Reflect甚至Boost Hana之类的东西时,我还没有发现对这样的东西的支持。

我已经找到了way to get the member names and typenames of a non-bitfield struct using Boost Hana [对于普通结构,它实现了#1和#2],还有一个way to get the member names of a bitfield struct using Boost Fusion [对于位域结构,它实现了#1],尽管这是一个自定义代码解决方案。

或者,将结构手动展平/衰减为单个unit32_t成员结构,如this post

struct BitsFlattened{
  uint32_t message;
}
也可以使用

为适当的成员手动编码的getter和setter,getter可能会使用其名字ex公开信息。 getopCode05(),getheader69()。

0 个答案:

没有答案