13

このようなことを行う方法はありません.C++にはありますか?

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

どこx == v[0]y == v[1]

4

8 に答える 8

17

CではなくC++を使用していて、それらは同じタイプであるため、v [0]へのxa参照とv [1]へのya参照を作成しないのはなぜですか

于 2009-03-31T19:30:09.763 に答える
16

どうですか

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

編集:

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

醜いが、それはより正確です

于 2009-03-31T19:29:47.517 に答える
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;
}
于 2009-03-31T20:57:30.927 に答える
5

私は以前にこのようなものを使用しました。標準で100%OKかどうかはわかりませんが、使用する必要のあるコンパイラでは問題ないようです。

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

必要に応じて、境界チェックなどをoperator []に追加できます(おそらく必要です)。また、operator[]のconstバージョンを提供することもできます。

パディングが心配な場合(そして、構造体のパディングを強制的に解除するために適切なプラットフォーム固有のビットを追加したくない場合)、次を使用できます。

struct Vec2
{
  float x;
  float y;
  float& operator[](int i) {
    assert(i>=0);
    assert(i<2);
    return (i==0)?x:y;
  }
  const float& operator[](int i) const {
    assert(i>=0);
    assert(i<2);
    return (i==0)?x:y;
  }
};
于 2010-09-27T08:01:07.030 に答える
1

「スカラー」が何であるかにもよりますが、はい、C++でそれを行うことができます。構文は、あなたがあなたの例で書いたものとほぼ同じです(おそらく正確に正確かもしれませんが、私はユニオンに錆びています)。ユニオンに入れることができる型に制限があることを除いて、C と同じです (IIRC にはデフォルトのコンストラクターが必要です)。関連するウィキペディアの記事は次のとおりです。

于 2009-03-31T19:29:39.437 に答える