C++联合数组和变量?

mpe*_*pen 7 c++ unions

在C++中有没有办法做这样的事情?

union {
    {
        Scalar x, y;
    }
    Scalar v[2];
};
Run Code Online (Sandbox Code Playgroud)

哪里x == v[0]y == v[1]

Bri*_*ndy 18

由于您使用的是C++而不是C,并且因为它们属于相同的类型,为什么不将xa引用到v [0]并且引用v [1]

  • +1.这很好地解决了v [1]不能保证C++语言规则与y对应的事实. (2认同)

fid*_*ido 14

怎么样

union {
    struct {
        int x;
        int y;
    };
    int v[2];
};
Run Code Online (Sandbox Code Playgroud)

编辑:

union a {
    struct b { int first, second; } bee;
    int v[2];
};
Run Code Online (Sandbox Code Playgroud)

丑陋,但更准确

  • 至少,请添加offsetof(v [1])== offsetof(y)的编译时断言(使用例如BOOST_STATIC_ASSERT).在大多数编译器/平台上都会出现这种情况,但确保它永远不会受到伤害. (3认同)
  • 根据x,y和z的类型,以及您正在使用的特定编译器,甚至是目标平台,您可能会看到由数据对齐引起的问题.本质上,x和y可能不一定与v [0]和v [1]直接对应地驻留在存储器中. (2认同)
  • +1约翰瓦茨.C++保证数组的元素是连续布局的,但只能保证POD结构元素的地址大于所有先前声明的元素的地址(即布局结构的灵活性更大). (2认同)

Mar*_*ork 6

试试这个:

template<class T>
struct U1
{
    U1();
    T   v[2];
    T&  x;
    T&  y;
};

template<class T>
U1<T>::U1()
    :x(v[0])
    ,y(v[1])
{}

int main()
{
    U1<int>   data;

    data.x  = 1;
    data.y  = 2;
}
Run Code Online (Sandbox Code Playgroud)

  • 我说的是,对于本质上提供对两个数据的访问的东西,结果的结构在很大程度上通过保持两个额外的指针来扩展......在某些情况下这可能是可接受的,而在其他情况下是不可接受的.向那些看着这个解决方案的人发出警告. (4认同)

Mic*_*son 5

我以前用过这样的东西。我不确定它的标准是否 100% OK,但是对于我需要使用它的任何编译器似乎都可以。

struct Vec2
{
  float x;
  float y;
  float& operator[](int i) { return *(&x+i); }
};
Run Code Online (Sandbox Code Playgroud)

如果您愿意(您可能应该想要),您可以向 operator[] 添加边界检查等,并且您也可以提供 operator[] 的 const 版本。