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 dasthis
-Objekt als 2. Argument anboost::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.