Это в основном экземпляр шаблона Observer (как уже упоминали и связывали другие). Тем не менее, вы можете использовать шаблон магии, чтобы сделать его немного более синтаксически палитрируемым. Рассмотрим что-то вроде ...
template <typename T>
class Observable
{
T underlying;
public:
Observable<T>& operator=(const T &rhs) {
underlying = rhs;
fireObservers();
return *this;
}
operator T() { return underlying; }
void addObserver(ObsType obs) { ... }
void fireObservers() { /* Pass every event handler a const & to this instance /* }
};
Тогда вы можете написать ...
Observable<int> x;
x.registerObserver(...);
x = 5;
int y = x;
Какой метод вы используете для написания функций обратного вызова наблюдателя, полностью зависит от вас; Я предлагаю http://www.boost.org's функциональные или функциональные модули (вы также можете использовать простые функторы). Я также предупреждаю вас быть осторожным с перегрузкой операторов этого типа. Хотя это может сделать определенные стили кодирования более понятными, безрассудное использование рендера что-то вроде
кажется, LikeAnIntToMe = 10;
очень дорогостоящая операция, которая вполне может взорваться и стать причиной отладки кошмаров на долгие годы.