0

メソッドにr値を返すようにすることについて考えていました。具体的には、オーバーロードされた演算子を使用してこれを行う方法があるかどうか疑問に思いました。私はこのコードを持っています:

struct vec4 {
    float x;
    float y;
    float z;
    float w;
    ...
    inline float operator [] (int i)
    {
            switch (i) {
            case 0:
                    return this->x;
            case 1:
                    return this->y;
            case 2:
                    return this->z;
            case 3:
                    return this->w;
            default:
                    exit(1);
                    return 0;
            }
    }
};

どうすればこれを変更して、何かを次のような効果に使用できるようにすることができますか

vec4 v;
...
v[2] = 5.0f;

C ++ 11での右辺値参照について聞いたことがありますが、それらは潜在的な解決策になる可能性がありますか?

編集:実際のコードを挿入する方法を見つけました。

4

3 に答える 3

6

これにはC++11は必要ありません。ただ持っている:

float & operator[](std::size_t i) { return data[i]; }

今、あなたは言うことができv[2] = 5;、すべてが順調です。

必要に応じて、参照を使用せず、値の読み取りに使用できる一定のオーバーロードを追加できます。

float operator[](std::size_t i) const { return data[i]; }

右辺値メンバー関数修飾子を検討できるのは、一時メンバーの割り当てを許可する場合のみです。

vec4{}[2] = 5;

その場合でも、左辺値参照を返しますが、メンバー関数を修飾する必要があります。

float & operator[](std::size_t i) && { return data[i]; }
//                               ^^^^
于 2012-12-31T16:36:20.317 に答える
4

あなたは単に使うことができます:

float& operator [] (int index)
{
    return data [i];
}

これにより、書き込みが可能になりv[2] = 5.0f;、期待どおりに機能します。ここではr値の参照は必要ありません。

次のように、値を取得するためにconst-overloadも追加する必要があります。

float operator [] (int index) const
{
    return data [i];
}

これにより、次のようなコードを記述できますconst vec4 v; float x = v[1];

于 2012-12-31T16:36:07.913 に答える
4

達成したいことについては、右辺値ではなく左辺値を返したいようです。それは実際には非常に簡単です。

float &operator[](size_t i) { return data[i]; }

inlineクラス定義内で関数を定義する場合は冗長であることに注意してください。クラス定義内で関数を定義するとinline、デフォルトでそれが作成されます。

于 2012-12-31T16:37:27.810 に答える