基于交换机访问成员变量的好方法

Sil*_*ter 3 c++ coding-style readability

我正在使用以下模式处理包含多个函数的代码

memberType* var = NULL;
switch(someVariable)
{
  case 0: var = &object.MemberVariable1; break;
  case 1: var = &object.MemberVariable2; break;
  case 2: var = &object.MemberVariable3; break;
}
Run Code Online (Sandbox Code Playgroud)

成员变量属于同一类型.在一些开关中有几十个案例,它们使功能体与基本上只是数据相混淆.我想创建一个数组,地图或类似的东西,以便我可以根据输入值访问成员.

我想要有类似的东西

sometype array[size] = {member1, member2, member3}
Run Code Online (Sandbox Code Playgroud)

所以功能可以包含

memberType* var = array[index];
Run Code Online (Sandbox Code Playgroud)

而不是开关.

1. 我的第一个想法是在类中创建一个包含单个成员变量和数组的联合,因此我可以访问各个成员或通过array + index访问它们.这是丑陋的,乍一看代码并不明显,并迫使成员变量以连续的方式声明.它也不允许我为不同的索引访问相同的成员变量.

2. 拥有一个包含返回单个成员变量的函数的函数指针的数组迫使我创建大量的一行getter函数.

3. 有一个静态分配的对象,所以我可以做类似的事情

int offsets[size] = {
*(int*)&staticObject.member1 - *(int*)&staticObject,
*(int*)&staticObject.member2 - *(int*)&staticObject, 
*(int*)&staticObject.member3 - *(int*)&staticObject}
Run Code Online (Sandbox Code Playgroud)

并使用它

var = (memberType*)(*(int*)&object + offsets[index]);
Run Code Online (Sandbox Code Playgroud)

真可怕

有没有一种很好的方法可以摆脱这种不必要的冗长模式?

免责声明:我没有测试示例中使用的代码.这只是为了说明.


编辑:我忘了提到一件重要的事情:我不想因为序列化而改变类的大小 - 我还没有理解我正在使用的实现.

use*_*575 6

您可能想查看指向成员的指针.这将使您能够更清晰地实施您的建议(3).

让我们说你的班级看起来像这样.

class X {
public:
  memberType MemberVariable1;
  memberType MemberVariable2;
  memberType MemberVariable3;
};
Run Code Online (Sandbox Code Playgroud)

现在我们将定义一个指向成员变量的指针数组.

typedef memberType X::*MemberVar;
MemberVar ptrs[3] = {
  &X::MemberVariable1,
  &X::MemberVariable2,
  &X::MemberVariable3
};
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用数组.

X obj;
memberType var = obj.*(ptrs[index]);
Run Code Online (Sandbox Code Playgroud)