Heim  >  Artikel  >  Backend-Entwicklung  >  Wie geht std::bind mit Mitgliedsfunktionen um und warum ist eine Objektreferenz erforderlich?

Wie geht std::bind mit Mitgliedsfunktionen um und warum ist eine Objektreferenz erforderlich?

DDD
DDDOriginal
2024-10-31 23:47:29454Durchsuche

How does std::bind handle member functions, and why is an object reference required?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn