Callback mit Memberfunktionen
-
Hallo...
Ist es möglich mit Memberfunktionen ein Callbacksystem zu erstellen? Die Klasse leitet von einem Interface ab. Es soll dennoch möglich sein, dass man eigene Funktionsnamen verwendet. Geht so etwas?Pseudocode:
typedef void (IAddon::*)(std::string Bla) EventCallback; // ... class Addon : public IAddon { public: virtual void DoSomething() { AddonManager->RegisterEvent(this, Addon::MyFunc, "player_spawn"); // Signatur: RegisterEvent(IAddon *pAddon, EventCallback CB, std::string EventName); } void MyFunc(std::string Bla) { // mach was } };Gruß
-
boost::function
-
theliquidwave schrieb:
typedef void (IAddon::*)(std::string Bla) EventCallback;Ich denk mal du meinst:
typedef void (IAddon::* EventCallback)(std::string Bla);theliquidwave schrieb:
Es soll dennoch möglich sein, dass man eigene Funktionsnamen verwendet. Geht so etwas?
Ja, aber wozu hier?
-
theliquidwave schrieb:
Ist es möglich mit Memberfunktionen ein Callbacksystem zu erstellen?
An sich ja, aber zuerst die Gegenfrage:
Ist dir der Unterschied zwischen einer (nicht-statischen) Memberfunktion und einer Funktion bewusst?Wenn nein, solltest du dir erst einmal darüber Gedanken machen. Grundsätzlich reicht es bei einer nicht-statischen Memberfunktion nicht aus, einen Zeiger auf die Memberfunktion zu speichern, sondern du erforderst auch einen Zeiger auf die konkrete Instanz um den Aufruf durchzuführen.
Der TR1 mit function/bind oder die boost-Entsprechungen könnten hier weiter helfen.
Ganz davon abgesehen würde ich Copy-By-Value bei nicht-integralen Datentypen vermeiden (ich beziehe mich hier auf deine std::string Übergabe, meist ist hier eine konstante Referenz als Übergabeparameter weitaus sinnvoller).
-
Ja, aber wozu hier?
Weil man mehrere Events (>100) registrieren _könnte_. Dann alles in eine Funktion, die in IAddon virtual ist, zu leiten, um dann alles mit if-Abfragen zu machen, finde ich doch sehr hässlich.
Ist dir der Unterschied zwischen einer (nicht-statischen) Memberfunktion und einer Funktion bewusst?
Normalerweise schon. Es geht mir ja eben darum, dass die Funktion nicht-statisch sind. Bei statischen Funktionen habe ich das Instanzen- und Memberproblem ja nicht.
Der TR1 mit function/bind oder die boost-Entsprechungen könnten hier weiter helfen.
Geht das ganze nicht irgendwie anders? Die Interfaces sollen nämlich an Autoren weitergegeben werden, die möglichst einfach eine Funktion registrieren können sollen. So ein Gefrickel mit boost ist doch dann extrem kompliziert, und nur um das zu realisieren müsste ich die ganze boost-Lib einbinden...
Ganz davon abgesehen würde ich Copy-By-Value bei nicht-integralen Datentypen vermeiden (ich beziehe mich hier auf deine std::string Übergabe, meist ist hier eine konstante Referenz als Übergabeparameter weitaus sinnvoller).
Stimmt, war auch eher Beispielhaft. Normalerweise verwende ich
const std::string &StringName;Gruß
-
theliquidwave schrieb:
Der TR1 mit function/bind oder die boost-Entsprechungen könnten hier weiter helfen.
Geht das ganze nicht irgendwie anders? Die Interfaces sollen nämlich an Autoren weitergegeben werden, die möglichst einfach eine Funktion registrieren können sollen. So ein Gefrickel mit boost ist doch dann extrem kompliziert, und nur um das zu realisieren müsste ich die ganze boost-Lib einbinden...
Du könntest schauen wie boost das macht und es nachprogrammieren. Oder das hier nehmen. Oder eines der sechshundert Milliarden Functionpointer-Tutorials lesen und von dort klauen.
Ob das dann weniger Gefrickel ist als mit boost, sei mal dahingestellt.
-
Danke!
Das ist genau das, was ich gesucht habe
Gruß