2010-07-06 34 views

Trả lời

5

Không có lớp chuẩn như bạn mô tả, nhưng Boost.Signals là một thư viện thông báo khá mạnh. Tôi sẽ tạo ra một wrapper cho các đối tượng mà đặt ra một tín hiệu khi nó được thay đổi, dọc theo dòng này:

#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

Không có thứ gì trong STL. Điều đó không có nghĩa là ai đó đã không tạo ra một thứ như vậy trong thư viện nguồn mở, nhưng tôi không tin đó là một phần của ngôn ngữ.

-1

Bạn sẽ cần phải viết của riêng bạn và trả lại cho vùng chứa yêu thích của bạn.

0

Con đường tôi đang làm việc đó tôi có cái gì đó như notify_updatedwait_event trong bộ sưu tập của tôi, và tôi gọi notify_updated sau khi thay đổi được thực hiện, và sau đó trong các phần khác tôi đang chờ đợi cho các sự kiện. Giải pháp của tôi là rất cụ thể cho vấn đề tôi đang giải quyết, vì vậy nó là C-ish. Nghĩ về khái niệm tương tự như mẫu của Mike.

Các vấn đề liên quan