Callback funktion



  • Hallo,
    ich wollte Nachfragen wie so eine Callback Funktion aufgebaut ist und wie sie funktioniert. Eine kleine Einführung eventuell mit einem Beispiel wäre sehr nett. Danke





  • Beispiel mit Funktionszeigern:

    #include <iostream>
    #include <ostream>
    
    typedef void FuncType(int);
    
    void for_range(int begin, int end, FuncType* callback)
    {
      for (int i=begin; i<end; ++i) {
        callback(i);
      }
    }
    
    void my_callback(int i)
    {
      std::cout << i << std::endl;
    }
    
    int main()
    {
      for_range(0,10,&my_callback);
      return 0;
    }
    

    etwas neumodischer (C++2011):

    #include <iostream>
    #include <ostream>
    #include <functional>
    
    void for_range(int begin, int end, std::function<void(int)> callback)
    {
      for (int i=begin; i<end; ++i) {
        callback(i);
      }
    }
    
    int main()
    {
      int faktor = 11;
      for_range(0,10,[=](int i) {
        std::cout << i*faktor << std::endl;
      });
      return 0;
    }
    

    Vorteil: std::function<> ist nicht auf Funktionszeiger beschränkt, sondern kann Funktionsobjekte kapseln, die einen Zustand besitzen (hier: 'faktor').



  • @krümelkacker
    Soweit ich das jetzt beurteilen kann, ist die callback-Funktion eine Übergabe des Pointers einer Funktion. So hat man die Möglichkeit andere Pointer bzw. Funktionen aufzurufen. Habe ich das richtig verstanden!

    Normalerweise würde ich deinen Code so schreiben,was auch den gewünschten Effekt hat:

    #include <iostream>
    #include <ostream>
    
    typedef void FuncType(int);
    
    void for_range(int begin, int end)
    {
      for (int i=begin; i<end; ++i) {
        my_callback(i);
      }
    }
    
    void my_callback(int i)
    {
      std::cout << i << std::endl;
    }
    
    int main()
    {
      for_range(0,10);
      return 0;
    }
    

    Danke



  • Beobachter01 schrieb:

    Normalerweise würde ich deinen Code so schreiben,was auch den gewünschten Effekt hat:

    Deine for_range Funktion ruft aber immer dieselbe callback - Funktion auf. krümels Version ist in der Lage, je nach Bedarf eine andere callback - Funktion aufrufen. Die aufzurufende Funktion wird als Parameter übergeben, so wie die beiden int - Parameter auch, for_range ist so viel flexibler. Siehe auch das qsort - Beispiel in dem Link, auf den Braunstein verwiesen hat.


Anmelden zum Antworten