【发布时间】:2013-07-07 18:45:37
【问题描述】:
我正在编写包含多个具有以下模式的函数的代码
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]);
太可怕了。
有什么好方法可以摆脱这种不必要的冗长模式吗?
免责声明:我没有测试示例中使用的代码。这只是为了说明。
编辑:我忘了提到一件重要的事情:我不想因为序列化而改变类的大小 - 我还没有理解我正在使用的实现。
【问题讨论】:
-
C 语言中有很多地图实现。为什么不只使用其中之一?
-
问题是如何存储对成员变量的访问,而不是容器类型或实现
-
为什么数组中的成员不以开头?也就是说,当您似乎真的想要一个数组时,为什么还要有离散成员?
-
@JoeZ:因为每个变量都有不同的含义,并且在代码的其余部分中使用不同。该数组仅对带有这些开关的功能有意义。这是我正在重构的旧代码,所以我必须小心。
-
您可以创建一个 const&[N],或使用可以进行边界检查的 GetMemberAt(int)(可能与您的开关相同)。 At 可能更好。
标签: c++ coding-style readability