В узких кругах хорошо известно, что в 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'а их не сделать.