enumerator mit klassenmethode als callback



  • hi leute

    folgende ueberlegeung:
    angenommen ich mache eine funktion enumerate_childs.
    z.b. in der winapi kann man da dann einen pointer auf eine funktion uebergeben, die dann mit jedem gefundenen child aufgerufen wird.
    wenn ich nun anstatt einer funktion eine klassenfunktion uebergeben will, wie mach ich das dann ?
    muss ich da eine basisklasse mit einer virtuallen funktion schreiben und immer davon ableiten oder geht das auch ohne ?

    in pseudecode wuerde ich mir das so vorstellen:

    class irgendwas
    {
       public:
          bool mein_callback(child *c)
          {
             ...
             return true; /* true wenn weiter enumeriert werden soll */
          }
    };
    
    irgendwas irg;
    
    int res = enumerate_childs(params..., &irg::mein_callback);
    

    gibt es da eine moeglichkeit ?

    Meep Meep


  • Mod

    ES gibt viele Möglichkeiten. Die erste Frage, die du beantworten musst, ist: Für welches Objekt soll die Methode aufgerufen werden?

    Wenn das Objekt etwas unter der Kontrolle von enumerate_childs ist, dann übergibst du einen Zeiger oder Referenz auf die Methode (ja, Funktionszeiger können auch auf Memberfunktionen zeigen!).

    Wenn das Objekt unter der Kontrolle des Aufrufers steht, dann geht das logischerweise nicht. Dann muss du als Callback irgendetwas übergeben, was einen für enumerate_childs aufrufbaren operator() hat. Da gibt es verschiedene Möglichkeiten, das selber zu schreiben oder Sachen aus der Standardbibliothek zu nutzen. Die mit Abstand bequemste und daher empfehlenswerteste Methode sollte sein, std::bind zu benutzen.



  • als Template Parameter dann nicht nur als Funktions oder Methoden-Zeiger - sondern eben alles was das Interface unterstützt

    void func_function(int a)
    {
      std::cout << a << std::endl;
    }
    
    struct/*class*/ func_struct
    {
      void operator(int a)
      {
        std::cout << a << std::endl;
      }
    }
    
    template<class Functor>
    void meine_for(Functor functor)
    {
      for(int i = 0; i < 10; ++i)
      {
        functor(i);
      }
    }
    
    meine_for(func_function);
    meine_for(func_struct);
    

Log in to reply