C # -Like Delegaten in C ++

7

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

zu haben %Vor%

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%     
Mister 31.05.2014, 19:17
quelle

5 Antworten

16

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.

%Vor%     
Dietmar Kühl 31.05.2014, 21:06
quelle
2

Was ist mit boost.signals2 ?

%Vor%

Die connect -Funktion des Signals ist im Grunde das, was Sie mit += meinen.

    
tr3w 01.06.2014 18:14
quelle
1

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 ).

    
Chris Vine 01.06.2014 21:13
quelle
0

Wie wäre es stattdessen mit dem Beobachtermuster?

%Vor%

Ich denke, C ++ wie C # aussehen zu lassen, ist nicht wirklich das "Ding", weil es ziemlich anders ist. Ich würde mir auch die verlinkte Frage zu Multicast ansehen.

    
paulm 31.05.2014 23:22
quelle
0

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.

    
pepper_chico 01.06.2014 07:05
quelle

Tags und Links