没有办法做这样的事情,在C ++中吗?
union {
{
Scalar x, y;
}
Scalar v[2];
};
x == v[0]
和y == v[1]
在哪里?
怎么样
union {
struct {
int x;
int y;
};
int v[2];
};
编辑:
union a {
struct b { int first, second; } bee;
int v[2];
};
丑陋,但是更准确
由于您使用的是C ++,而不是C,并且由于它们的类型相同,所以为什么不只将x引用为v [0],将y引用为v [1]
尝试一下:
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;
}
我以前使用过类似的东西。我不确定标准是否100%可以,但是对于我需要使用它的所有编译器来说似乎都可以。
struct Vec2
{
float x;
float y;
float& operator[](int i) { return *(&x+i); }
};
如果需要(您可能想要的话,可以在operator []中添加边界检查等,也可以提供operator []的const版本。
取决于什么是“标量”,是的,您可以在C ++中实现。语法与您在示例中编写的内容几乎完全一样(甚至可能完全一样,但我对联合并不满意)。它与C相同,除了对联合中可能存在的类型有限制(IIRC,它们必须具有默认构造函数)。这是相关的Wikipedia article。
我一直在寻找类似的东西,并最终提出了解决方案。
[我一直在寻找一个可以同时用作值数组和单个值的数据存储对象(以提高最终用户编写Arduino库的灵活性)。
这是我想出的:
class data{
union{
float _array[3];
struct{float _X, _Y, _Z;};
};
public:
float& X = _X;
float& Y = _Y;
float& Z = _Z;
float& operator[](int index){
if (index >= 3) return _array[0]; //Make this action whatever you want...
return _array[index];
}
float* operator&(){return _array;}
};
int main(){
data Test_Vector;
for(int i = 0; i < 3; i++){
Test_Vector = i;
}
cout<<"Member X = "<<Test_Vector.X;
cout<<"Member Y = "<<Test_Vector.Y;
cout<<"Member Z = "<<Test_Vector.Z;
float* vector_array = &Test_Vector;
cout<<"Array = {"<<vector_array[0]<<", "<<vector_array[1]<<", "<<vector_array[2]<<"}";
}
由于运算符重载,我们可以像使用数组一样使用数据对象,并且可以将其用于函数调用中的传递引用(就像数组一样!
注:请确保检查您的系统是否由于结构的填充而起作用。如果有更多C ++经验的人有更好的跨平台友好方式来模仿我的上面的代码,我希望看到它!