我正在处理包含具有以下模式的多个函数的代码
memberType* var = NULL;
switch(someVariable)
{
case 0: var = &object.MemberVariable1; break;
case 1: var = &object.MemberVariable2; break;
case 2: var = &object.MemberVariable3; break;
}
成员变量的类型相同。在某些开关中,有几十种情况,它们将函数体与基本上只是数据的东西混为一谈。我想创建一个数组、映射或类似的东西,这样我就可以根据输入值访问成员。
我想有类似的东西
sometype array[size] = {member1, member2, member3}
所以函数可以包含
memberType* var = array[index];
而不是开关。
1. 我的第一个想法是在包含单个成员变量和数组的类中创建一个联合,这样我可以访问单个成员或通过数组+索引访问它们。这很难看,乍一看从代码中并不明显,并强制成员 vars 以连续方式声明。它也不允许我访问不同索引的相同成员变量。
2. 拥有一个包含指向返回单个成员变量的函数的函数指针的数组,这迫使我创建大量的单行 getter 函数。
3. 拥有一个静态分配的对象,这样我就可以做类似的事情
int offsets[size] = {
*(int*)&staticObject.member1 - *(int*)&staticObject,
*(int*)&staticObject.member2 - *(int*)&staticObject,
*(int*)&staticObject.member3 - *(int*)&staticObject}
并使用它
var = (memberType*)(*(int*)&object + offsets[index]);
太可怕了。
有没有一种很好的方法来摆脱这种不必要的冗长模式?
免责声明:我没有测试示例中使用的代码。这只是为了说明。
编辑:我忘了提到一件重要的事情:我不想因为序列化而改变类的大小——我还没有理解我正在使用的实现。