2013-03-21 15 views
5

Ein einfaches Beispiel, das erklärt, wie std::bind kann wie folgt verwendet werden:Wie kann std :: bind verwendet werden?

Angenommen, wir haben eine Funktion von 3 Argumente: f3 (x, y, z). Wir wollen eine Funktion von 2 Argumenten haben, die wie folgt definiert ist: f2(x,y) = f3(x,5,y). In C++ wir es leicht mit std::bind tun können:

auto f2 = std::bind(f3, _1, 5, _2); 

Dieses Beispiel ist mir klar: std::bind nimmt eine Funktion als erstes Argument und dann dauert es n andere Argumente, wobei n die Anzahl der Argumente der Funktion das ist das erste Argument für std::bind.

Allerdings fand ich eine andere Verwendung von bind:

void foo(int &x) 
{ 
    ++x; 
} 


int main() 
{ 
    int i = 0; 

    // Binds a copy of i 
    std::bind(foo, i)(); // <------ This is the line that I do not understand. 
    std::cout << i << std::endl; 

} 

Es ist klar, dass foo ein Argument hat und mit std::bind es wurde i gesetzt. Aber warum verwenden wir ein anderes Paar Klammern nach (foo, i)? Und warum verwenden wir keine Ausgabe der std::bind? Ich meine, warum haben wir nicht auto f = std::bind(foo, i)?

+2

Was in aller Welt ist '\\\'? –

+0

Es sollte ein Kommentar sein: // – Roman

Antwort

8

Die Linie

std::bind(foo, i)(); 

entspricht:

auto bar = std::bind(foo, i); 
bar(); 

es ein gebundenes Funktors schafft, dann sofort ruft es (das zweite Paar von Klammern verwendet wird).

Edit: Im Namen der Genauigkeit (und von @Roman, @daramarak hingewiesen) sind die beiden nicht tatsächlich gleichbedeutend mit dem Aufruf der Funktion direkt: Das i wird von Wert nach Std :: Bind übergeben. Der Code äquivalent foo direkt mit i zu nennen, wäre:

auto bar = std::bind(foo, std::ref(i)); 
bar(); 
+0

Meine Kommentare über einen ungültigen Einspruch entfernt – daramarak

2

Ihre beiden Fragen ziemlich sie beantworten. Der nachlaufende () ist nur ein normaler Funktionsaufruf. Daher bedeutet der Ausdruck: "Binden Sie i an foo; das wird eine Funktion ergeben, die keine Parameter nimmt; dann rufen Sie die resultierende Funktion auf." Da der Autor des Codes entschieden hat, dass die Funktion nach dem Aufruf nicht mehr benötigt wird, wird sie nirgendwo gespeichert.

3

Es bindet foo in ein temporäres Objekt und es dann sofort anrufen:

auto f = std::bind(foo, i); 
    f(); 

Einzelzeilenversion:

std::bind(foo, i)(); 
0

Da die Linie

std::bind(foo, i)() ; 

... funktioniert das gleiche Sache wie ...

foo(i); 

... dies ist nicht wirklich eine 'Verwendung' von std :: bind, die Sie im tatsächlichen Code finden können, aber es dient als eine einfache Illustration dessen, was std :: bind tut, wie in anderen erläutert Antworten.

Wie Sie bemerken, ist es der übliche Fall, das Ergebnis der Bindung zu speichern und an anderer Stelle aufzurufen, sonst macht es keinen Sinn, den Code mit einem std :: bind zu verkomplizieren.

Verwandte Themen