boost::bind



  • Hallo Leute,

    kann mir eventuell jemand erklären, warum die dritte Variante in meinem Beispiel nicht kompiliert (C2825), wobei die boost::bind-Doku sagt, dass dort implizit men_fn verwendet werden sollte?

    eventStartMove.connect( boost::function<void()>( &NodeWidget::OnFrameStartMove, this ) );
    eventMove     .connect( boost::bind( boost::mem_fn(&NodeWidget::OnFrameMove), this, _1 ) );
    eventStopMove .connect( boost::bind( &NodeWidget::OnFrameStopMove, this, _1 ) );
    

    Danke für alle Tipps!

    Michael

    PS: Naja, nun habe ich das _1 einfach mal weggelassen und es kompiliert wunderbar! Vielleicht habe ich das noch nicht so ganz durchstiegen, ich dachte der erste Parameter von ner mem_fn wäre halt der "this"-Zeiger.



  • Fändest du nicht, dass wir den Codekontext kennen dürften? Und auch C2825 wissen wohl die wenigsten von uns auswendig 😉

    Aber ich nehme mal an, NodeWidget::OnFrameStopMove() nimmt keine Parameter. Dann musst du nur das this -Objekt als 2. Argument an boost::bind() übergeben.



  • _1 ist ein Platzhalter für den ersten Parameter des Funktionsobjektes, das boost::bind zurückgibt. Mit

    boost::bind( &NodeWidget::OnFrameStopMove, this, _1 )
    

    versuchst du, this an den ersten Parameter von NodeWidget::OnFrameStopMove (den this-Zeiger) zu ketten und den ersten Parameter des Funktionsobjektes, das du durch den Aufruf erhältst, an OnFrameStopMoves zweiten Parameter. Wenn OnFrameStopMove keinen zweiten Parameter hat, geht das schief.

    Einfaches Anschauungsbeispiel:

    #include <boost/bind.hpp>
    #include <iostream>
    
    void foo(int x, int y) {
      std::cout << x << ", " << y << std::endl;
    }
    
    int main() {
      boost::bind(foo, 2, _1)(3);     // Ausgabe: 2, 3
      boost::bind(foo, _1, _1)(3);    // Ausgabe: 3, 3
      boost::bind(foo, _2, _1)(2, 3); // Ausgabe: 3, 2
    }
    


  • Wie funktioniert das mit den _1 und _2 usw.? Sind das Makros?



  • Q schrieb:

    Wie funktioniert das mit den _1 und _2 usw.? Sind das Makros?

    Nein, das sind std::placeholder's



  • Q schrieb:

    Wie funktioniert das mit den _1 und _2 usw.? Sind das Makros?

    Das sind Objekte spezieller Typen, die mit viel TMP-Magie innerhalb von bind gesonderd gehandhabt werden.


Log in to reply