Мне было интересно, чтобы метод возвращал значение 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, и могут ли они быть потенциальным решением?
РЕДАКТИРОВАТЬ: я нашел способ вставить в свой фактический код.
Для этого не требуется 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]; }
// ^^^^
Вы можете просто использовать:
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];
,
Для того, что вы хотите достичь, вы, очевидно, хотите вернуть lvalue, а не rvalue. Это на самом деле довольно просто:
float &operator[](size_t i) { return data[i]; }
Обратите внимание, что когда вы определяете функцию внутри определения класса, inline
избыточно — определение функции внутри определения класса делает его inline
по умолчанию.