10

この質問をする最も簡単な方法は、いくつかのコードを使用することです。

struct Point
{
    int x;
    int y;
    int z;

    int* as_pointer() { return &x; }        // works
    int (&as_array_ref())[3] { return &x; } // does not work   
};

as_pointerコンパイルしますが、as_array_refしません。キャストは適切なようですが、適切な構文がわかりません。何か案は?

4

3 に答える 3

11

typedef を使用すると、配列型の方が扱いやすいことがわかります。

typedef int ints[3];

次に、あなたas_array_refはそのように書かれなければなりません&as_array_ref() == &x

次の構文が可能です。

  1. int*からへの単純な C スタイルのキャストints*:

    ints& as_array_ref() { return *( (ints*)(&x) ); }

  2. C++ スタイルreinterpret_cast(@Mike Seymour が提案 - 彼の回答も参照)。多くの場合、C++ ではより良い方法と見なされます。

    ints& as_array_ref() { return *reinterpret_cast<ints*>(&x); }

  3. キャスト from which int&toints&は少し短いですが (私にとっては) 直感的ではありません:

    ints& as_array_ref() { return reinterpret_cast<ints&>(x); }

于 2013-04-25T11:00:37.333 に答える
8

変数への参照を配列への参照として再解釈するために必要なキャストは次のとおりです。

reinterpret_cast<int(&)[3]>(x);

これを使用すると、未定義の動作が発生することに注意してください。それはおそらく賢明な実装で動作しますが、配列がパディングされないのに対し、クラスのメンバー間にパディングがないという保証はありません。

于 2013-04-25T11:22:53.530 に答える
2

あなたがやろうとしていることは、ユニオンを使えばより簡単(そしてより明確/きれい)になると思います。

于 2013-04-25T11:05:29.890 に答える