Methode einer bestimmten Klasse soll Funktionspointer auf Methode X-beliebiger klasse nehmen können



  • Hi!

    Geht das?
    Ich möchte, dass eine bestimmte Klasse eine Methode hat, zB "void SetOnReceiveCallback(...)", und dieser können Methoden von jedem Klassentyp als Funktionspointer übergeben und dann später aufgerufen werden.

    Also eine Methode, welcher man jede beliebige Callback-Funktion (mit passenden Parametern/Rückgabewert) übergeben kann. Sei es eine globale Callback-Funktion oder eben eine Funktion einer klasse.



  • das problem, worüber du dir noch gedanken machen musst, ist folgendes: wenn du eine normale memberfunktion einer klasse aufrufen willst, musst du sie immer für ein bestimmtes objekt aufrufen. d.h. du müsstest zusätzlich zu deiner callback-funktion eine referenz/zeiger auf das objekt, für das du sie aufrufen willst, übergeben. prinzipiell.
    das bedeutet, du musst dir gedanken über die lifetime der objekte machen, deren memberfunktionen du als callback aufrufen willst.

    wenn du das so wirklich tun möchtest, kannst du z.b. boost.function verwenden, oder generell gesagt funktionsobjekte/funktoren, die du deiner setcallback-methode übergeben kannst - egal ob es globale funktionen oder methoden sind. boost bietet dir da eine lösung, der neue C++ standard macht es ähnlich (gleich). google einfach nach diesen stichwörtern 🙂



  • Ja, nimm boost::function.
    Dadurch kann sich der User z.B. auch aussuchen, ob er das Objekt durch den Funktor am Leben halten will, oder nicht.

    Dank der flexibilität von boost::function und boost::bind muss nichtmal die Signatur genau stimmen, man kann Parameter dazubinden, den Returnwert ignorieren oder implizit konvertieren etc.

    Bzw. mit C++0x kann der User sogar ne Lambda-Expression übergeben.



  • Krank 😃
    Danke! Ich freu mich schon auf die nächsten Jahre mit C++!



  • function und bind gehören meiner Meinung nach zu den mächtigsten Alltagswerkzeugen auf Bibliotheksebene. Ich benutze sie relativ oft in meinen Projekten, die Flexibilität ist wirklich enorm.

    Übrigens gibt es sie auch im TR1 (Technical Report 1), falls deine Standardbibliothek diesen unterstützt.


Anmelden zum Antworten