Alexander Kuklev (akuklev) wrote,
Alexander Kuklev
akuklev

Category:

C++ & properties

В узких кругах хорошо известно, что в C++ можно изготавливать properties. Насколько я понимаю, наиболее правильный способ состоит в том, чтобы создать в библиотеке создаётся класс вида property<T, getter, setter>, работающий как в примере ниже:
class Foo {
  public:
    Property<int, get_alpha, set_alpha> alpha;
    
  private:
    int _alpha;
    int get_alpha() {
        return _alpha;
    }
    void set_alpha(const int &new_value) {
        preprocess();
        _alpha = new_value;
        postprocess();
    }
}

Геттер и сеттер можно сделать virtual и тогда с наследованием тоже всё будет в порядке. Ещё можно отнаследовать property<T, getter, setter> от какого-нибудь characteristic<T, getter> (штука с геттером и без сеттера). Определение класса property должно выглядеть примерно так:
template <typename T, T get(), void set(const T&)> class Property {
  public:
    T & operator = (const T &new_value) {
        set(new_value)
        return new_value;
    }
    template <typename T2> T2 & operator = (const T2 &new_value) {
        T2 &guard = new_value;
        throw guard; // Never reached.
    }
    operator T const & () const {
        return get();
    }
};

Оно всё замечательно заинлайнивается и упрощается во время компиляции, в результате чего использование properties не вносит никакого замедления в работу программы. Единственные недостатки — сообщения об ошибках у компилятора из-за странных типов получаются иногда нечитабельными, да IDE иногда с типами начинает путаться.

Теперь вопрос к аудитории: в какой стандартной библиотеке это уже сделано? Не создавать же свой велосипед каждый раз?

Upd: Да, сигнатура property должна быть, конечно же, хитрее. Мы же туда не указатели на функции суём, а указатели на методы. Что-то там типа T (O::*get)() и void (O::*set)(const T&) должно быть. И указатель на свой this пропертя должна помнить, так что совсем уж без доп.расходов не получится. Видимо, потому и не используют в C++ обычно properties, что без чрезмерного overhead'а их не сделать.
Subscribe

  • (no subject)

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

  • Прогресс

    Десять дней назад, вторая ступень SpaceX'овского корабля Starship своим ходом слетала своим ходом на десять километров вверх, и усмепшно приземлилась…

  • О водосбережении

    Как известно, питьевая вода во многих странах дефицитный ресурс. И даже в дождливой Германии летом иногда случаются засухи, в результате которых она…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 4 comments