Короткий ответ - нет, вы не можете этого сделать.
Для двумерного вектора, к которому вы можете обращаться в виде массива, я бы сделал что-то вроде этого:
struct Vec2 {
float x;
float y;
const float &operator[](const size_t i) const {
static_assert(sizeof(Vec2) == 2 * sizeof(float));
assert(i < 2);
return (&x)[i];
}
float &operator[](const size_t i) {
return const_cast<float &>(std::as_const(*this)[i]);
}
};
Таким образом, вы можете получить доступ к переменным-членам напрямую или использовать перегруженный оператор нижнего индекса.
Vec2 v{4, 5};
v.x += 9;
v[1] = -3;
В общем, методы получения и установки вызываются явно. Соглашение об именах, которое я видел довольно часто, дает геттеру и сеттеру одно и то же имя.
class Foo {
public:
int member() const {
return hidden;
}
void member(const int value) {
hidden = value;
}
private:
int hidden;
};
Это соглашение об именах делает доступ очень чистым, но все же проясняет, что происходит вызов функции.
Foo f;
f.member(5);
int five = f.member();