2010-07-06 3 views

ответ

5

Нет стандартного класса, который вы описываете, но Boost.Signals - довольно мощная библиотека уведомлений. Я хотел бы создать оболочку для объектов, которые поднимает сигнал при его изменении, вдоль линий этого:

#include <boost/signals.hpp> 
#include <vector> 
#include <iostream> 

// Wrapper to allow notification when an object is modified. 
template <typename Type> 
class Observable 
{ 
public: 
    // Instantiate one of these to allow modification. 
    // The observers will be notified when this is destroyed after the modification. 
    class Transaction 
    { 
    public: 
     explicit Transaction(Observable& parent) : 
      object(parent.object), parent(parent) {} 
     ~Transaction() {parent.changed();} 
     Type& object; 

    private: 
     Transaction(const Transaction&); // prevent copying 
     void operator=(const Transaction&); // prevent assignment 

     Observable& parent; 
    }; 

    // Connect an observer to this object. 
    template <typename Slot> 
    void Connect(const Slot& slot) {changed.connect(slot);} 

    // Read-only access to the object. 
    const Type& Get() const {return object;} 

private: 
    boost::signal<void()> changed; 
    Type object; 
}; 

// Usage example 
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); 
    } // callback called here 
} 
0

В STL нет такой вещи. Это не значит, что кто-то не создал такую ​​вещь в библиотеке с открытым исходным кодом, но я не верю, что это часть языка.

-1

Вам нужно будет написать свой собственный и вернуть его в свой любимый контейнер.

0

То, как я это делаю у меня есть что-то вроде notify_updated и wait_event в моей коллекции, и я называю notify_updated после внесения изменений, а затем в других частях я жду событий. Мое решение очень специфично для проблемы, которую я решаю, так что это больше C-ish. Думал, что это похоже на концепцию Майка.

Смежные вопросы