Ich habe versucht, ein C# -artiges Ereignissystem in C++ mit den tr1-Funktionsvorlagen zu implementieren, die zum Speichern einer Funktion verwendet werden, die das Ereignis behandelt.Vergleichen std :: tr1 :: function <> Objekte
Ich habe einen Vektor, so dass mehrere Zuhörer an dieser Veranstaltung angebracht werden kann, d.h .:
vector< function<void (int)> > listenerList;
ich einen Handler aus der Liste in der Lage sein möchten, entfernen Sie einen Listener Ereignisse empfangen zu stoppen.
Also, wie kann ich den Eintrag in dieser Liste finden, der einem bestimmten Listener entspricht? Kann ich testen, ob sich ein "Funktions" -Objekt in der Liste auf eine bestimmte Funktion bezieht?
Danke!
EDIT: Nach dem boost :: signal-Ansatz scheint es, dass es wahrscheinlich mit einem Token-System implementiert wurde, wie einige von Ihnen vorgeschlagen haben. Here's some info on this. Ein Beobachter behält ein "Connection" -Objekt bei, wenn er an ein Ereignis anfügt, und dieses Verbindungsobjekt wird verwendet, um bei Bedarf die Verbindung zu trennen. So sieht es aus, ob Sie Boost verwenden oder Ihre eigenen mit Tr1 rollen, das Grundprinzip ist das gleiche. d. h. es wird ein wenig tollpatschig :)
Wenn Sie eine Struktur mit zusätzlichen Informationen verwenden, können Sie auch die Funktoren als Hash-Werte und die GUID/was auch immer als Hash-Schlüssel speichern. :-) –
Sie können Funktoren nicht als Hashwerte speichern. Du kannst nichts mit ihnen machen. Wenn man sie in eine Struktur (sogar eine Ein-Element-Struktur nur des Funktors) einpackt, kann man etwas mit ihnen machen. Es ist beabsichtigt, dass sie nicht ohne etwas Arbeit verglichen werden können. – hazzen