Gibt es eine Bibliothek, die es mir erlaubt, objektorientierte Rückrufe in C ++ einfach und bequem zu erstellen?
Die Sprache Eiffel zum Beispiel hat das Konzept von "Agenten", die mehr oder weniger so funktionieren:
%Vor%Ausgabe wird sein: Hallo von Bar! 3 Hallo von Foo!
Also - der Agent erlaubt es, eine Memberfunktion in ein Objekt zu kapseln, sie entlang einiger vordefinierter Aufrufparameter (Hi from Foo) zu übergeben, die offenen Parameter (?) anzugeben und sie an ein anderes Objekt zu übergeben, das sie dann aufrufen kann später.
Da c ++ es nicht erlaubt, Funktionszeiger auf nicht-statischen Elementfunktionen zu erstellen, scheint es nicht so trivial zu sein, etwas so einfach in c ++ zu implementieren. Ich fand einige Artikel mit Google auf objektorientierten Callbacks in C ++, aber tatsächlich suche ich nach Bibliotheken oder Header-Dateien, die ich einfach importieren kann, die mir erlauben, eine ähnlich elegante Syntax zu verwenden.
Hat jemand ein paar Tipps für mich?
Danke!
Menschen verwenden normalerweise eines von mehreren Mustern:
Vererbung. Das heißt, Sie definieren eine abstrakte Klasse, die den Callback enthält. Dann nimmst du einen Zeiger / Verweis darauf. Das bedeutet, dass jeder diesen Callback erben und bereitstellen kann.
%Vor%Vererbung erneut. Das heißt, Ihre Stammklasse ist abstrakt, und der Benutzer erbt davon und definiert die Callbacks, anstatt eine konkrete Klasse und dedizierte Callback-Objekte zu haben.
%Vor%Noch mehr Vererbung - statisch. Auf diese Weise können Sie Vorlagen verwenden, um das Verhalten eines Objekts zu ändern. Es ähnelt der zweiten Option, funktioniert aber zur Kompilierungszeit statt zur Laufzeit, was je nach Kontext zu verschiedenen Vor- und Nachteilen führen kann.
%Vor%Sie können Memberfunktionszeiger oder normale Funktionszeiger verwenden und verwenden
%Vor%Es gibt Funktionsobjekte - sie überladen den Operator (). Sie werden einen funktionalen Wrapper verwenden oder schreiben wollen, der zur Zeit in der std :: / boost :: -Funktion zur Verfügung gestellt wird, aber ich werde hier auch einen einfachen zeigen. Es ähnelt dem ersten Konzept, verbirgt aber die Implementierung und akzeptiert eine Vielzahl anderer Lösungen. Ich persönlich benutze das normalerweise als meine Rückrufmethode der Wahl.
%Vor%Die richtige Lösung hängt hauptsächlich vom Kontext ab. Wenn Sie eine C-style-API bereitstellen müssen, dann ist Funktionszeiger der einzige Weg zu gehen (erinnern Sie sich an void * für Benutzerargumente). Wenn Sie zur Laufzeit variieren müssen (z. B. wenn Sie Code in einer vorkompilierten Bibliothek verfügbar machen), kann die statische Vererbung hier nicht verwendet werden.
Nur eine kurze Anmerkung: Ich habe den Code ausgepackt, damit er nicht perfekt ist (wie Zugriffsmodifizierer für Funktionen usw.) und möglicherweise ein paar Bugs enthält. Es ist ein Beispiel.
C ++ erlaubt Funktionszeiger auf Member-Objekten.
Weitere Details finden Sie hier .
Sie können auch boost.signals oder boost.signals2 (abhängig davon, ob Ihr Programm Multithread ist oder nicht).
Es gibt viele Möglichkeiten in C ++, wobei das Problem im Allgemeinen eine Syntax ist.
boost::bind
für eine noch mehr ... interessante ... Syntax (*) ()
überlädt, zum Beispiel void Functor::operator()(int a) const;
, weil es ein Objekt ist, das es angibt und von einer gemeinsamen Schnittstelle ableiten kann
std::function
+ Die Lambda-Funktionen sind wirklich großartig, wenn es um Ausdruckskraft geht. Ich würde mich über eine Überprüfung der Lambda-Syntax freuen;)
%Vor% Natürlich ist func
nur lebensfähig, während foo
realisierbar ist (Scope-Problem). Sie könnten foo
kopieren, indem Sie [=foo]
verwenden, um den Wert als Wert anzugeben, statt als Referenz.
Tags und Links c++ oop callback member-function-pointers eiffel