std::bind -> Interpretation von this als 2. Argument



  • Hallo an alle,
    mich quält schon länger die Frage wie genau bei einem std::bind aufruf ein this Zeiger als 2. Argument interpretiert wird.

    Als Beispielcode:

    class DoSomething {
    public:
      using Callback = std::functional<void()>;
    
      Callback   mCallback;
    }
    
    class DoSomethingToo {
    public:
      DoSomething   mDoSomething;
    
      void execution() {
        mDoSomething.Callback = std::bind(&DoSomethingToo::myExecution, this);
      }
    
    private:
      void myExecution() {  ... };
    }
    

    Callback hat ja keine Parameter, also was genau macht nun der this-Zeiger in der Form / wie darf ich den interpretieren?
    Als Lambda:

    ...
      mDoSomething.Callback = [this] () {  ... //statt myExecution ... };
    ...
    

    In der Dokumentation vom MSDN war das ganze nicht wirklich ersichtlich, da dort nur von gebunden Parametern geschrieben wird, was ja auch verständlich ist, aber wenn es keine Parameter gibt ^^ ?

    Ich hoffe ich hab das jetzt einigermaßen verständlich ausgedrückt.



  • this->myExecution();
    

    Da es Lamdas gibt ist bind ziemlich überflüssig.


  • Mod

    Die von bind s Rückgabewert repräsentierte Funktion ist mittels INVOKE definiert, was hier beschrieben ist: http://en.cppreference.com/w/cpp/utility/functional/invoke

    Der erste Stichpunkt ist gleich zutreffend.



  • Danke für die Antwort von Arcoth, auch wenn das für mich doch noch etwas schwer zu verstehen ist

    Und ohne respektlos erscheinen zu wollen, ich habe gefragt wie man solch ein Konstrukt interpretieren darf, nicht ob es Sinn macht oder gar überflüssig ist.

    Es war nur eine reine beispielhafte Darstellung um mein Problem kurz und präzise zu verdeutlichen.

    Infolge dessen wünsche ich noch einen angenehmen Sonntag. 🙂



  • std::bind(&DoSomethingToo::myExecution, this);
    

    Eine Memberfunktion die du binden und aufrufen willst, muss immer mit seinem zugehörigen Objekt einhergehen. std::bind() kann nicht wissen, dass du damit "this" meinst, nur weil du das Ding innerhalb einer Klasse aufrufst.

    Deswegen gibt man eine Referenz des Objekts mit an.


Log in to reply