我正在寻找一种在C ++中对像这样的位域结构进行“反射”的方法:
struct Bits {
uint32_t opCode : 5;
uint32_t header : 3;
uint32_t source : 5;
uint32_t destination : 5;
uint32_t offset : 13;
};
我的目标是能够得到类似的东西
带有最小手动编码,宏或样板代码。这些值原则上应该能够在编译时确定,尽管不是必须的。
通读this StackOverflow post之后,很明显标准C ++之外的库提供了一些“反射”功能。调查诸如Precise and Flat Reflection,Ponder,Boost 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()。