C ++ объединение массивов и переменных? - PullRequest
7 голосов
/ 31 марта 2009

Нет способа сделать что-то подобное, в C ++ есть?

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

Где x == v[0] и y == v[1]?

Ответы [ 5 ]

18 голосов
/ 31 марта 2009

Поскольку вы используете C ++, а не C, и поскольку они относятся к одним и тем же типам, почему бы просто не сделать x ссылкой на v [0], а y ссылкой на v [1]

14 голосов
/ 31 марта 2009

Как насчет

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

редактирование:

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

Ужасно, но это точнее

6 голосов
/ 01 апреля 2009

Попробуйте это:

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 голосов
/ 27 сентября 2010

Я использовал что-то подобное раньше. Я не уверен, что стандарт на 100% в порядке, но, похоже, он подходит для всех компиляторов, на которых мне нужно было его использовать.

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

Вы можете добавить проверку границ и т. Д. К оператору [], если хотите (возможно, вам нужно), и вы можете предоставить const-версию оператора [].

1 голос
/ 31 марта 2009

В зависимости от того, что такое «Скаляр», вы можете сделать это в C ++. Синтаксис почти точно (возможно, даже точно, но я ржавый на союзы), что вы написали в своем примере. Это то же самое, что и C, за исключением того, что существуют ограничения на типы, которые могут быть в объединениях (IIRC должен иметь конструктор по умолчанию). Вот соответствующая статья в Википедии .

...