作者:k78283381 | 2023-08-28 16:27
在C++中有没有办法做这样的事情?
union {
{
Scalar x, y;
}
Scalar v[2];
};
哪里x == v[0]
和y == v[1]
?
1> Brian R. Bon..:
由于您使用的是C++而不是C,并且因为它们属于相同的类型,为什么不将xa引用到v [0]并且引用v [1]
+1.这很好地解决了v [1]不能保证C++语言规则与y对应的事实.
2> fido..:
怎么样
union {
struct {
int x;
int y;
};
int v[2];
};
编辑:
union a {
struct b { int first, second; } bee;
int v[2];
};
丑陋,但更准确
至少,请添加offsetof(v [1])== offsetof(y)的编译时断言(使用例如BOOST_STATIC_ASSERT).在大多数编译器/平台上都会出现这种情况,但确保它永远不会受到伤害.
根据x,y和z的类型,以及您正在使用的特定编译器,甚至是目标平台,您可能会看到由数据对齐引起的问题.本质上,x和y可能不一定与v [0]和v [1]直接对应地驻留在存储器中.
+1约翰瓦茨.C++保证数组的元素是连续布局的,但只能保证POD结构元素的地址大于所有先前声明的元素的地址(即布局结构的灵活性更大).
3> Martin York..:
试试这个:
template
struct U1
{
U1();
T v[2];
T& x;
T& y;
};
template
U1::U1()
:x(v[0])
,y(v[1])
{}
int main()
{
U1 data;
data.x = 1;
data.y = 2;
}
我说的是,对于本质上提供对两个数据的访问的东西,结果的结构在很大程度上通过保持两个额外的指针来扩展......在某些情况下这可能是可接受的,而在其他情况下是不可接受的.向那些看着这个解决方案的人发出警告.