std::bind der Klasse member-Funktion
Habe ich diesen code:
#include <iostream>
#include <functional>
struct Foo
{
int get(int n) { return 5+n; }
};
int main()
{
Foo foo;
auto L = std::bind(&Foo::get, &foo, 3);
std::cout << L() << std::endl;
return 0;
}
Scheint, dass diese:
auto L = std::bind(&Foo::get, &foo, 3);
ist equivalento zu:
auto L = std::bind(&Foo::get, foo, 3);
Warum?
- Das ist es nicht. Man bindet ein Zeiger, der andere bindet eine Kopie.
- Für was es Wert ist, Sie können auch einen intelligenten Zeiger (jede Art, die
operator->
zurückgebenfoo*
) als zweites argument. Versuchen Sie es mit einemstd::shared_ptr
. - duplizieren:stackoverflow.com/questions/15264003/... Aber ich mag beide Antworten...
Du musst angemeldet sein, um einen Kommentar abzugeben.
std::bind()
akzeptiert Ihre Argumente von Wert. Dies bedeutet, dass im ersten Fall übergeben Sie eine Zeiger von Wert, was in der Kopie der Zeiger. Im zweiten Fall, übergeben Sie ein Objekt des Typsfoo
von Wert, was in einer Kopie von einem Objekt des TypsFoo
.Als Folge, im zweiten Fall wird die Auswertung des Ausdrucks
L()
bewirkt, dass die member-Funktionget()
aufgerufen werden, die auf eine kopieren des ursprünglichen Objektsfoo
, die möglicherweise oder möglicherweise nicht, was Sie wollen.Dieses Beispiel illustriert den Unterschied (vergessen, die Verletzung der Regel von Drei/in der Regel aus Fünf, das ist nur zur Veranschaulichung):
Wenn aus irgendeinem Grund Sie nicht wollen, um mit dem Cursor die form, die Sie verwenden können,
std::ref()
um zu verhindern, dass eine Kopie des Arguments erstellt werden:Sie sind nicht das gleiche. Die generische Funktion binder
std::bind
Kopien es Argumente. Im Fall vonstd::bind(&Foo::get,&foo,3)
, die Zeiger kopiert, aber beim Aufruf der gebundenen Objekt, es gilt noch die ursprünglichefoo
Objekt. Instd::bind(&Foo::get,foo,3)
das Objektfoo
wird kopiert, und die späteren Aufruf gilt für die gebundene Kopie, nicht das original-Objekt.Sie können dies testen, indem eine member-Funktion, die auf den internen Zustand des Objekts, binden Sie das Objekt in beide Richtungen, ändern Sie das ursprüngliche Objekt und sehen Sie, wie die Ergebnisse sich unterscheiden.