std::bind Parameter an Parameterlosen Methoden anhängen



  • Hallo,
    ich bin über ein paar Zeilen gestolpert die mir einfach nicht in den Kopf gehen wollen, wie denn genau das Funktioniert. Die Dokumentation ist in dem Bereich auch eher sehr sparsam.

    Und Zwar wurde in einem std::function<void(Basisklasse&, float)> Funktiosnwrapper eine Methode der Basisklasse ohne Parameter "gebunden". Wie das ganze gemacht wurde bzw. was genau eigentlich da passiert, kann ich mir überhaupt nicht erklären.

    Als vereinfachtest Beispiel:

    #include <iostream>
    #include <functional>
    
    using namespace std::placeholders;
    
    class Basisklasse
    {
    public:
      void doSomething()
      {
        std::cout << "Ich soll was tun!" << std::endl;
      }
    };
    
    int main( )
    {
      Basisklasse ichbins;
    
      std::function<void(Basisklasse&, float)> action;
    
      action = std::bind(&Basisklasse::doSomething, _1);
    
      action(ichbins, 3.4f);
    
      return EXIT_SUCCESS;
    }
    

    Aus meiner Sicht:
    Der Funktionswrapper action erwartet eine Funktion vom Typ void (Basisklasse, float), also eine Funktion ohne Rückgabewert und zwei Parameter vom Typ Basisklasse und float. (Der zweite Parameter ist rein beliebig jetzt gewählt)

    In der Basisklasse ist eine public Methode doSomething die keine Parameter besitzt.
    Beim std::bind, binde ich jetzt einen 'leeren Parameter' an die Methode doSomething.

    --> Hier jetzt was ich nicht verstehe:
    Nun wird bei der Zuweisung dieses neu erstellte function-Objekt dem action zugewiesen, aber das "neue doSomething" hat meines Erachtens doch jetzt nur einen Parameter, der einfach nur wirr in der Luft steht.
    <--
    Zur Ausführung hab ich ja nun auch einfach nur noch beliebige Werte genommen, damit nur die Bedingungen erfüllt sind, aber benutzen kann ich sie ja nicht in der Methode.

    Edit:
    Bitte klärt mich nicht um den Sinn und Zweck davon aus oder ob es veraltet ist oder dergleichen, das hab ich nicht gefragt.



  • doSomething hat genau genommen einen versteckten parameter: Basisklasse* (this)

    wenn die funktion static waere, dann waere sie parameterlos



  • std::bind reicht überzählige Parameter einfach nicht weiter. ichbins wird als "this" für die Memberfunktion an _1 verwendet, 3.4f ist einfach über.


Anmelden zum Antworten