Callback auf gebundene Methode?



  • Hallo ich hab folgenden Callback:

    typedef void (*CmdCallback)(std::string);
    

    Nun möchte ich einem CmdCallback eine Methode einer Klasse zuweisen... Geht es irgendwie? Also ich meine es so (aber so geht es natürlich nicht):

    class IchBekommeEinenCallback
    {
        public:
            void print(std::string);
    };
    
    /* Irgendwo anderst */
    IchBekommeEinenCallback test;
    
    CmdCallback pointer = &test.print;
    

    Ich hoffe es ist verständlich.
    Gruß FireFlow



  • typedef void (IchBekommeEinenCallback::*CmdCallback)(std::string);
    // ...
    CmdCallback pointer = &IchBekommeEinenCallback::print;
    


  • Das geht nicht weil es mehrere verschiede Klassen (und eventuell auch Funktionen) gibt die einen Callback erhalten. Achja und selbst wenn würde es mir ganz nix bringen weil der Caller nix von der Instanz weiß.

    Und nochmal:
    Ich hab hier was gefunden: http://www.newty.de/fpt/callback.html#example1
    Das ist ja eine Menge aufwand... 😕 gehts nicht irgendwie einfacher?



  • Um Functionspointer und Methodenzeiger zu mischen, kannst Du Dir eine Klasse bauen, die den eigentlichen Aufruf übernimmt. Das kann in etwa so aussehen:

    class Call {
    public:
      virtual void call() = 0;
    };
    
    class FunctionCall : public Call {
    public:
      typedef void (*function)( void);
      FunctionCall( function f) : theFunction( f);
      virtual void call() { theFunction(); };
    private:
      function theFunction;
    };
    
    template <class T>
    class MethodCall_ : public Call
    {
    public:
      typedef  void (T::* method)( void);
      MethodCall_( T* inst, method m) : _instance( inst), _m( m);
      void call( void) { _instance->*_m(); }
    private:
      T* _instance;
      method _m;
    };
    


  • Das sieht gut aus ich werds versuchen.

    KRASS!!! Es geht... Ich glaub in deinem Beispiel sind ein paar kleine Fehler aber von Prinzip her ist das gut.



  • niemand schrieb:

    Um Functionspointer und Methodenzeiger zu mischen, kannst Du Dir eine Klasse bauen

    Gibts dafür nicht schon std::mem_fun oder besser boost::bind?



  • Oder gleich boost::signal benutzten. 🙄



  • Boost kenne ich so genau, daher keine Ahnung.

    std::mem_fun ist ähnlich, aber wie z.B. bekomme ich eine Liste von Funktionen hin, die ich aufrufen möchte?
    Beispiel:
    list<Call*> oder map<string, Call*>
    Wie geht das mit mem_fun?


Anmelden zum Antworten