Wie std::bind mit Mitgliedsfunktionen funktioniert
Bei der Verwendung von std::bind mit Mitgliedsklassenfunktionen kommen mehrere Schlüsselkonzepte ins Spiel :
Das erste Argument: Ein Zeiger
In der Syntax std::bind(&Foo::print_sum, &foo, 95, _1) ist das erste Argument nicht eine Referenz auf einen Funktionszeiger, wie man annehmen könnte. Stattdessen ist es ein Zeiger, der die Mitgliedsfunktion selbst darstellt.
Das zweite Argument: Eine Objektreferenz
Das zweite Argument, in diesem Fall &foo , ist eine Referenz auf ein Objekt der entsprechenden Klasse (Foo). Dies ist notwendig, da für eine Member-Funktion eine Objektinstanz erforderlich ist.
Wie std::bind Member-Funktionen behandelt
Intern erkennt std::bind, dass die Das erste Argument ist ein Zeiger auf eine Mitgliedsfunktion und konvertiert diese mithilfe von std::mem_fn in ein aufrufbares Objekt. Dieses aufrufbare Objekt behält den Zeiger auf die Mitgliedsfunktion und erfordert eine Objektinstanz als erstes Argument.
Die Notwendigkeit einer Objektreferenz
Bei der Bindung an eine Mitgliedsfunktion wird ein Objektverweis unerlässlich, da die Memberfunktion einer bestimmten Klasse zugeordnet ist und den Aufruf eines Objekts dieser Klasse erfordert. Das zweite Argument für std::bind stellt diese Objektreferenz bereit, sodass die Mitgliedsfunktion mit dem angegebenen Objekt arbeiten kann.
Beispiel
Betrachten Sie den folgenden Code:
<code class="cpp">struct Foo { int value; void f(int n) { std::cout << "f(" << this->value << ", " << n << ")\n"; } }; int main() { Foo foo{10}; auto f_bound = std::bind(&Foo::f, &foo, _1); f_bound(20); // Output: f(10, 20) }</code>
In diesem Beispiel ist f_bound ein aufrufbares Objekt, das die f-Member-Funktion für das foo-Objekt mit allen zusätzlichen Argumenten aufruft, die es empfängt. Wenn wir also f_bound(20) aufrufen, entspricht das dem Aufruf von foo.f(20), der „f(10, 20)“ ausgibt.
Das obige ist der detaillierte Inhalt vonWie geht std::bind mit Mitgliedsfunktionen um und warum ist eine Objektreferenz erforderlich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!