2010-07-06 4 views
5

Existe-t-il une implémentation de classes de conteneur pour C++ prenant en charge la notification de la même manière que ObservableCollection for C#?conteneur observable pour C++

Répondre

5

Il n'y a pas de classe standard comme vous l'avez décrit, mais Boost.Signals est une bibliothèque de notification assez puissante. Je voudrais créer un emballage pour des objets qui soulève un signal lorsqu'il est changé, le long des lignes de ce:

#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

Il n'y a rien de tel dans STL. Cela ne veut pas dire que quelqu'un n'a pas créé une telle chose dans une bibliothèque open source, mais je ne crois pas que cela fasse partie du langage.

-1

Vous devrez écrire les vôtres et les sauvegarder dans votre conteneur préféré.

0

La façon dont je le fais, j'ai quelque chose comme notify_updated et wait_event dans ma collection, et j'appeler notify_updated après les modifications sont faites, puis dans d'autres parties, j'attends des événements. Ma solution est très spécifique au problème que je suis en train de résoudre, donc c'est plus C-ish. Pensé que c'est conceptuellement similaire à l'échantillon de Mike.