Ich habe ein wenig Nachforschungen angestellt, bin aber nicht zu einer konkreten Lösung gekommen. Ich würde das wirklich gern tun können:
%Vor%Aber natürlich in C ++. Ich habe nur eine Lösung gefunden, die mir eine solche Funktion bietet; aber seither wurde es offline genommen, aber ich habe es hier Ссылка erneut gepostet. Das einzige Problem mit der Lösung, die ich gefunden habe, ist, dass es kein moderner C ++ 11-Code ist und keine Lambda-Unterstützung hat.
Ich weiß, dass ich
verwenden kann %Vor% aber das einzige Problem dabei ist, dass es die Operatoren " +=
, -=
, ==
" nicht unterstützt. Jetzt habe ich darüber nachgedacht, meinen eigenen Events-Kurs zu machen und ein
mit etwas Templating, aber ich fand heraus, dass std :: function nicht den Operator ==
implementiert, so dass ich es nicht aussehen und fühlen lassen konnte wie C # tut.
Wie auch immer, meine Frage ist das:
Ich würde wissen, wie ich ein solches Ereignissystem mit C ++ 11 implementieren kann - oder ob es überhaupt möglich ist. Oder sogar, wenn Sie eine bessere / richtige Weise kennen, Callbacks zu implementieren, die mehrere Listener unterstützen (ich möchte, wenn überhaupt möglich, eine vollständige Observer Pattern-Implementierung vermeiden).
Update # 1
Meine Absichten für die Betreiber waren dies:
%Vor%Der C ++ - Funktionsobjektmechanismus unterscheidet sich ziemlich von dem C # -Ansatz. Insbesondere basieren Funktionsobjekte auf Werten und nicht auf Referenzen. Die Ursachenfunktionsobjekte können identifiziert werden, wenn sie in C ++ entfernt werden, dass das Funktionsobjekt eine Identität aufweist, d. H. Das Objekt, an dem sie aufgerufen werden, und die Elementfunktion, die aufgerufen wird. Außerdem ist es in C ++ nicht möglich, die Adresse eines Objekts und einer Elementfunktion gleichzeitig zu übernehmen.
Um ein System von Delegierten zu erstellen, das das Entfernen von Funktionen ermöglicht, könnten Sie etwas ähnlich wie std::function<Signature>
erstellen, aber mehrere Funktionen verwenden und erfordern, dass jede der verwendeten Funktionen EqualityComparable
ist. Im Folgenden finden Sie eine einfache Implementierung eines solchen Delegiertensystems zusammen mit einer Beispielimplementierung, wie ein Ordner für Elementfunktionen aussehen könnte. Es gibt viele offensichtliche Erweiterungsmöglichkeiten, da diese Implementierung nur als Demo gedacht ist.
Was ist mit boost.signals2 ?
%Vor% Die connect
-Funktion des Signals ist im Grunde das, was Sie mit +=
meinen.
Es gibt zahlreiche Bibliotheken, die solche Dinge anbieten. Einige Aufrufoperator + = für Delegaten wie "connect" oder "subscribe". Beispiele sind boost.signal2 , poco Abstraktes Ereignis , libsigc ++ oder wenn Sie es verwenden eine GUI Qt's Slot / Signal (oder wenn Sie gtk in C ++ verwenden, c++-gtk-utils Emitter ).
Die Poco-Bibliothek unterstützt Delegierte wie diese beispielsweise:
%Vor%Ausgabe:
onEvent von Target1: 42
onEvent von Target2: 42
onEvent von Target1: 24
Bibliotheks weise würde ich auch Boost.Signals2 empfehlen.