Можно ли переопределить поведение по умолчанию при получении члена структуры в C ++? - PullRequest
3 голосов
/ 10 января 2020

Подобно тегу @property в python, я пытаюсь выяснить, возможно ли переопределить поведение геттера в c ++ без необходимости вызова функции.

По сути, можно ли в c ++ сделать следующее:

class vector2(class):
    def __init__(self):
        self.values = [1,2]

    @property
    def x(self):
        return self.values[0]
pos = vector2()
my_var = pos.x

Является ли лучшим решением просто написать методы получения и установки?

1 Ответ

2 голосов
/ 10 января 2020

Короткий ответ - нет, вы не можете этого сделать.


Для двумерного вектора, к которому вы можете обращаться в виде массива, я бы сделал что-то вроде этого:

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();
...