Есть ли в c ++ функция, чтобы при изменении переменной она автоматически вызывала функцию?
Нет, не то чтобы я могла придумать.Вы можете, однако, обернуть доступ к переменной в подходящей оболочке, которая позволяет вам подключиться к назначению.
Примерно так:
//Beware, brain-compiled code ahead!
template<typename T>
class assignment_hook {
public:
typedef void (hook_t)(const T& old_value, const T& new_value);
assignment_hook(T& value, hook_t hook) : ref_(value), hook_(hook) {}
T& operator=(const T& rhs)
{
hook_(ref_,rhs);
ref_ = rhs;
}
private:
// I'd rather not want to think about copying this
assignment_hook(const assignment_hook&);
void operator=(const assignment_hook&);
T& ref_;
hook_t hook_;
};
Как отметил Ной в комментарии,
typedef boost::function<void(const T&,const T&)> hook_t;
(или, если он есть у вашего компилятора, std::tr1::function
или std::function
) значительно улучшит это, поскольку позволяет вызывать все виды "совместимых" функций.(Например, он позволяет использовать все виды магии, используя boost/std::/tr1::bind<>
для вызова функций-членов и еще много чего.)
Также обратите внимание, что, как сказал adf88 в своих комментариях, он просто выполняет то, о чем просил (контролировать доступ на записьпеременной) и ни в коем случае не является полноценной реализацией свойства.На самом деле, несмотря на отношение C ++ к максимально возможной реализации в библиотеках и как можно меньше в языке, и, несмотря на попытки многих людей (некоторые из них довольно умные), никто не нашел способа реализовать свойства в C ++ как библиотека , без поддержки языка.