Существует ли функция в C++, что, когда переменная была заменена, она автоматически вызывает функцию?
Если переменная имеет тип класса, вы можете перегрузить ее функцию operator = ()
. Вы не можете этого сделать, если переменная является примитивным типом.
Вы можете инкапсулировать эту переменную и иметь слушателей, которые уведомляются при изменении значения. Для этого я бы выбрал boost :: signal или boost :: signal2:
http://www.boost.org/doc/libs/1_43_0/doc/html/signals2.html
и вот некоторая информация на шаблоне наблюдателя: http://en.wikipedia.org/wiki/Observer_pattern
Одним словом; нет.
Но что вам нужно сделать, так это обернуть переменную в класс (я не собираюсь предлагать перегрузку оператора) и изменить ее с помощью функции set (...). Затем вы просто вызываете функцию из заданной функции.
Вы могли бы сделать переменную приватной для некоторого класса, а затем использовать функции-члены для изменения в первую очередь.
Вы можете поместить свой дополнительный код в саму функцию-член, или вы можете иметь этот код отдельно и поручить функции-члену вызывать его при изменении.
Есть ли в 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 ++. как библиотека , без поддержки языка.
Нет, вы должны инкапсулировать переменную в пару методов get/set.
В зависимости от сложности вашей программы вы можете использовать слушатели, которые отслеживают определенные объекты на предмет изменений состояния, а другие части вашей программы могут подписываться на события от этого слушателя.
Однако лучшим вариантом было бы поместить эту функциональность в метод установки для этой переменной. Это может быть функция слушателя или прямой вызов функции.