基于编译期反射实现结构体元素到不同向量元素的映射
编译期数据结构映射问题
我近期遇到技术瓶颈,找不到优雅的解决方案处理以下问题:
我有多个元素数量不同的数据结构,所有元素均按指针大小对齐且不大于指针,例如:
struct DATA_0{ size_t Value; size_t *PtrValue; bool BoolValue; };
或
struct DATA_1{ size_t Value0; size_t Value1; size_t *PtrValue; void *PtrBuffer; bool BoolValue; const char *StringBuffer; };
输入数据结构定义如下:
struct INPUT{ size_t *DataBuffer; size_t DataVector[16]; };
我需要在编译期将这些数据结构映射到DataBuffer或DataVector的不同元素中,具体要求:
- 映射规则由
#define/编译期开关控制,同一编译配置下所有结构的映射规则一致; - 结构体成员可映射至
DataBuffer或DataVector; - 结构体成员的索引(因数据对齐无需偏移)决定其映射目标,例如索引0的元素(如
DATA_0::Value或DATA_1::Value0)在某些配置下映射到DataVector[3],其他配置下映射到DataBuffer[0]; - 无索引映射规则的元素(通常为结构体前2-4个元素)需从
DataBuffer的指定元素开始依次映射;
期望用法示例:
INPUT *input; data_mapping<DATA_0> mapping_0(input); // 部分场景从input->DataVector[0]取值,其他场景从input->DataBuffer[0]取值 size_t tmpValue = mapping_0[Value]; data_mapping<DATA_1> mapping_1(input); // 部分场景从input->DataVector[1]取值,其他场景从input->DataBuffer[3]取值 size_t tmpPtrBuffer = mapping_1[PtrBuffer];
注:数据不一定以结构体形式存在,也可使用可变参数模板,例如:<size_t, Value, size_t, PtrValue, bool, BoolValue>
以下是我期望实现的伪代码示例:
template<class TMember, class TData> TMember GetElement(INPUT *Input, TData Data) { #ifdef FIRST_CASE if(indexof(TMember) == 0) { return Input->DataVector[0]; } if(indexof(TMember) == 1) { return Input->DataVector[1]; } return Input->DataBuffer[indexof(TMember) - 2]; #else if(indexof(TMember) == 0) { return Input->DataVector[2]; } if(indexof(TMember) == 1) { return Input->DataVector[3]; } if(indexof(TMember) == 2) { return Input->DataVector[4]; } if(indexof(TMember) == 3) { return Input->DataVector[5]; } return Input->DataBuffer[indexof(TMember)]; #endif } size_t tmpValue = GetElement<Value>(input,DATA_0); size_t tmpPtrBuffer = GetElement<PtrBuffer>(input,DATA_1);
内容的提问来源于stack exchange,提问作者user2281752
相关产品推荐
相关产品推荐

