C成员变量别名?

新手上路,请多包涵

我很确定这是可能的,因为我很确定我已经看到它完成了。我认为这很棒,但我很乐意接受“这是一个糟糕的想法,因为____”这样的答案。

假设我们有一个基本结构。

 struct vertex
{
    float x, y, z;
};

现在,我想在这些变量上实现别名。

 vertex pos;
vertex col;
vertex arr;

pos.x = 0.0f; pos.y = 0.5f; pos.z = 1.0f;
col.r = 0.0f; col.g = 0.5f; col.b = 1.0f;
arr[0] = 0.0f; arr[1] = 0.5f; arr[2] = 1.0f;

理想情况下,第三种语法与数组无法区分。也就是说,如果我发送 arr 作为一个函数的参考参数,该函数需要一个浮点数组来存储数据(例如,许多 OpenGL glGet 函数),它会工作美好的。

你怎么看?可能的?可能但愚蠢?

原文由 mcccclean 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 857
2 个回答

我要做的是制作访问器:

 struct Vertex {
    float& r() { return values[0]; }
    float& g() { return values[1]; }
    float& b() { return values[2]; }

    float& x() { return values[0]; }
    float& y() { return values[1]; }
    float& z() { return values[2]; }

    float  operator [] (unsigned i) const { return this->values_[i]; }
    float& operator [] (unsigned i)       { return this->values_[i]; }
    operator float*() const { return this->values_; }

private:
    float[3] values_;
}

原文由 Ray Hidayat 发布,翻译遵循 CC BY-SA 2.5 许可协议

使用工会?

 union vertex
{
    struct { float x, y, z; };
    struct { float r, g, b; };
    float arr[3];
};

我不会推荐它——它会导致混乱。


_补充_:

正如 Adrian 在他的回答中所指出的,ISO C++ 不支持这种具有匿名结构成员的联合。它在 GNU G++ 中工作(当您打开“ -Wall -ansi -pedantic ”时抱怨不支持)。这让人想起了标准之前的 C 天(K&R 第一版之前),当结构元素名称必须在所有结构中唯一时,您可以使用收缩符号来获得结构内的偏移量,并且您可以使用来自其他结构类型的成员名称 - 一种无政府状态。当我开始使用 C 时(很久以前,但在 K&R1 之后),这已经是历史用法了。

C11 (ISO/IEC 9899:2011) 支持匿名联合成员(对于两个结构)显示的符号,但早期版本的 C 标准不支持。 ISO/IEC 14882:2011 (C++11) 第 9.5 节提供匿名联合,但 GNU g++ (4.9.1) 不接受 -pedantic 显示的代码,识别“ warning: ISO C++ prohibits anonymous structs [-Wpedantic] ”。

由于这个想法会导致混乱,我并不特别担心它不是标准的。我不会为这项任务使用该机制(即使它是有益的,我也会对在联合中使用匿名结构持谨慎态度)。


提出了一个担忧:

这三个(xyz、rgb 和数组)不一定对齐。

它是一个由三个元素组成的联合体;这三个元素从同一个地址开始。前两个是包含 3 个浮点值的结构。没有继承,也没有虚拟函数来提供不同的布局等。这些结构将以三个连续的元素进行布局(实际上,即使标准允许填充)。该数组也从相同的地址开始,并且在结构中“无填充”的情况下,元素与两个结构重叠。我真的不认为会有问题。

原文由 Jonathan Leffler 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题