gpt4 book ai didi

C++ - 包含数组的 union

转载 作者:太空狗 更新时间:2023-10-29 20:56:10 25 4
gpt4 key购买 nike

如果我有一个包含数组的 C++ union 。我想使用一组唯一标识符访问数组的每个元素。 (这似乎是一件奇怪的事情。在我的应用程序中,我有一个 union 体,它包含指向 8 个方向的单元格的指针,它表示一些对象如何在单元格之间移动。有时编写使用数组索引的算法很方便,但是对于更喜欢使用命名标识符而不是不太明显的索引的最终用户来说,这并不方便。)

例子:

union vector
{
double x;
double y;
double data[2];
}

我相信 xy “是同一回事”,所以真的必须:

struct v
{
double x, y;
}

union vector
{
v data_v_format;
double data_arr_format[2];
}

然后你使用:

vector v1;
v1.data_arr_format[0] = v1.data_v_format.y; // copy y component to x

不幸的是,这给 union 增加了一层丑陋的语法。有什么方法可以完成语法指定的原始任务:

union vector
{
double x;
double y;
double data[2];
}

x 等价于 data[0]y 等价于 data[1]

我可以编写一个类来执行此操作,其中“逻辑命名的标识符变为函数,返回数组的单个组件”——但是有更好的方法吗?

最佳答案

无论如何,即使你找到了一种方法,从不活动的 union 字段中读取,即不从最后一个被写入的字段中读取,也是 UB。这实际上意味着经常看到的使用 union 在 4 个八位字节和 int 之间转换 IP 的示例是非法的。

您可以使用访问器:

struct vec
{
double data[2];
double& x() {return data[0];}
double& y() {return data[1];}
};

或者,您可以查看 C++ 中的 property 实现。它将创建一个代理对象,对其的访问将被重定向到特定的数组元素。

另一种方法是使用引用,但这会增加结构的大小(+每个引用的指针大小):

struct vec
{
double data[2];
double& x = data[0];
double& y = data[1];
};

关于C++ - 包含数组的 union ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34268733/

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