gpt4 book ai didi

c++ - 基于开关访问成员变量的好方法

转载 作者:太空狗 更新时间:2023-10-29 19:53:07 24 4
gpt4 key购买 nike

我正在编写包含具有以下模式的多个函数的代码

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

成员变量的类型相同。在某些开关中,有几十个 case,这使函数体变得杂乱无章,基本上只是数据。我想创建一个数组、映射或类似的东西,以便我可以根据输入值访问成员。

我在想有类似的东西

sometype array[size] = {member1, member2, member3}

所以函数可以包含

memberType* var = array[index];

而不是开关。

1.我的第一个想法是在包含单个成员变量和数组的类中创建一个 union ,这样我就可以访问单个成员或通过数组 + 索引访问它们。这很丑陋,乍一看从代码中看不出来,并且强制以连续的方式声明成员变量。它还不允许我访问不同索引的相同成员变量。

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]);

太可怕了。

有什么好的方法可以摆脱这种不必要的冗长模式?

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


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

最佳答案

您可能想查看 pointers to members .这将使您能够更干净地实现您的建议 (3)。

假设您的类(class)看起来像这样。

class X {
public:
memberType MemberVariable1;
memberType MemberVariable2;
memberType MemberVariable3;
};

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

typedef memberType X::*MemberVar;
MemberVar ptrs[3] = {
&X::MemberVariable1,
&X::MemberVariable2,
&X::MemberVariable3
};

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

X obj;
memberType var = obj.*(ptrs[index]);

关于c++ - 基于开关访问成员变量的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17515161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com