There is no standard class as you describe, but Boost.Signals is a pretty powerful notification library. I would create a wrapper for objects that raise a signal when it changes, line by line:
template <typename Type>
class Observable
{
public:
class Transaction
{
public:
explicit Transaction(Observable& parent) :
object(parent.object), parent(parent) {}
~Transaction() {parent.changed();}
Type& object;
private:
Transaction(const Transaction&);
void operator=(const Transaction&);
Observable& parent;
};
template <typename Slot>
void Connect(const Slot& slot) {changed.connect(slot);}
const Type& Get() const {return object;}
private:
boost::signal<void()> changed;
Type object;
};
void callback() {std::cout << "Changed\n";}
int main()
{
typedef std::vector<int> Vector;
Observable<Vector> o;
o.Connect(callback);
{
Observable<Vector>::Transaction t(o);
t.object.push_back(1);
t.object.push_back(2);
}
}
source
share