C ++联合数组和vars?

问题描述 投票:7回答:6

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

union {
    {
        Scalar x, y;
    }
    Scalar v[2];
};

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

c++ unions
6个回答
14
投票

怎么样

union {
    struct {
        int x;
        int y;
    };
    int v[2];
};

编辑:

union a {
    struct b { int first, second; } bee;
    int v[2];
};

丑陋,但是更准确


18
投票

由于您使用的是C ++,而不是C,并且由于它们的类型相同,所以为什么不只将x引用为v [0],将y引用为v [1]


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;
}

4
投票

我以前使用过类似的东西。我不确定标准是否100%可以,但是对于我需要使用它的所有编译器来说似乎都可以。

struct Vec2
{
  float x;
  float y;
  float& operator[](int i) { return *(&x+i); }
};

如果需要(您可能想要的话,可以在operator []中添加边界检查等,也可以提供operator []的const版本。


1
投票

取决于什么是“标量”,是的,您可以在C ++中实现。语法与您在示例中编写的内容几乎完全一样(甚至可能完全一样,但我对联合并不满意)。它与C相同,除了对联合中可能存在的类型有限制(IIRC,它们必须具有默认构造函数)。这是相关的Wikipedia article


0
投票

我一直在寻找类似的东西,并最终提出了解决方案。

[我一直在寻找一个可以同时用作值数组和单个值的数据存储对象(以提高最终用户编写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 ++经验的人有更好的跨平台友好方式来模仿我的上面的代码,我希望看到它!

© www.soinside.com 2019 - 2024. All rights reserved.