Возврат изменяемого значения в C ++ 11

Мне было интересно, чтобы метод возвращал значение 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;

Я слышал о ссылках rvalue в C ++ 11, и могут ли они быть потенциальным решением?

РЕДАКТИРОВАТЬ: я нашел способ вставить в свой фактический код.

0

Решение

Для этого не требуется C ++ 11. Просто иметь:

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

Теперь вы можете сказать v[2] = 5; и все хорошо.

Если вы хотите, вы можете добавить постоянную перегрузку, которая не использует ссылки и которая может быть использована для чтение Значение.

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

Единственный раз, когда вы можете рассмотреть квалификаторы функций-членов rvalue, это если вы хотите разрешить присваивание в временный член:

vec4{}[2] = 5;

В этом случае вы по-прежнему возвращаете ссылку на lvalue, но вы должны квалифицировать функцию-член:

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

Другие решения

Вы можете просто использовать:

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];,

4

Для того, что вы хотите достичь, вы, очевидно, хотите вернуть lvalue, а не rvalue. Это на самом деле довольно просто:

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

Обратите внимание, что когда вы определяете функцию внутри определения класса, inline избыточно — определение функции внутри определения класса делает его inline по умолчанию.

4
По вопросам рекламы [email protected]