std::bind, ein vielseitiges Tool in C, ermöglicht das Erstellen gebundener Funktionen für den späteren Aufruf. Es kann eine Herausforderung sein, die Verwendung mit Mitgliedsfunktionen zu verstehen, aber diese Diskussion soll die damit verbundenen Feinheiten beleuchten.
Beim Deklarieren einer Bindung für ein Mitglied Funktion ist das erste Argument von std::bind kein Verweis auf die Mitgliedsfunktion, sondern ein Zeiger darauf. Dies liegt daran, dass Funktionen und Datenelemente gleichermaßen in Zeiger zerfallen, wenn sie als Argumente übergeben werden.
Das zweite Argument von std::bind beim Umgang mit Elementfunktionen gibt das Objekt an oder Zeiger auf das Objekt, das zum Aufrufen der Memberfunktion verwendet wird. Dies ist notwendig, da Mitgliedsfunktionen einen impliziten this-Zeiger haben, der auf das Objekt zeigt, zu dem sie gehören.
Intern scheint std::bind ein aufrufbares Objekt zu erstellen, das den Zeiger umschließt zur Mitgliedsfunktion. Beim Aufruf dieser gebundenen Funktion wird das angegebene Objekt als This-Zeiger verwendet.
Im Gegensatz zu Funktionszeigern, die unabhängig von einem bestimmten Objekt sind, Member-Funktionszeiger sind an die Klasse gebunden, zu der sie gehören, können aber mit jedem Objekt dieser Klasse verwendet werden. std::bind unterstützt dies, indem es beim Umgang mit Mitgliedsfunktionen einen Objektzeiger als zweites Argument erfordert.
Betrachten Sie den folgenden Code:
<code class="cpp">struct Foo { void print_sum(int n1, int n2) { std::cout << n1 + n2 << '\n'; } }; Foo foo; auto f = std::bind(&Foo::print_sum, &foo, 95, _1);</code>
In diesem Beispielsweise ist das erste Argument für std::bind &Foo::print_sum, ein Zeiger auf die Mitgliedsfunktion print_sum innerhalb der Foo-Klasse. Das zweite Argument ist &foo, ein Zeiger auf das foo-Objekt. Beim Aufruf von f wird &foo als this-Zeiger verwendet, sodass print_sum mit dem richtigen Kontext für das foo-Objekt aufgerufen werden kann.
Das obige ist der detaillierte Inhalt vonWie funktioniert „std::bind' mit Mitgliedsfunktionen in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!