std::find_if() - Kann mir jemand diese Zeile erklären?



  • Hi,
    ich bin gerade via Google auf folgende Zeile gestoßen. So etwas (dritter Parameter) habe ich noch nie zuvor gesehen.
    Was passiert da?
    Danke!

    std::find_if(monsters.begin(), 
                 monsters.end(), 
                 [&cm = currentMonster]
                 (const monster& m) -> bool { return cm == m; });
    


  • Das scheint aus einem Artikel über C++0x zu kommen. Da wird gebraucht von einem lambda Ausdruck gemacht. Das ist eine inline Funktionsdefinition.

    Das hier:

    [&cm = currentMonster]
                 (const monster& m) -> bool { return cm == m; }
    

    Heisst nichts anderes, als dass es eine Funktion ist, welche einen Parameter vom Typ const monster& übernimmt und einen bool zurückgibt, falls cm gleich m true , ansonsten false . Und das in den eckigen Klammern heisst soviel, dass du der Funktion eben cm bekannt machst und in den Scope der Funktion ziehst.



  • Das ist ein Lambda-Ausdruck aus dem nächsten C++-Standard, C++0x. Mit Lambda-Ausdrücken kann man lokale Funktionen definieren und als Argumente an andere Funktionen übergeben.

    Im momentanen Standard müsste man dafür eine separate Funktion oder einen Funktor ausserhalb definieren (oder sowas wie Boost.Lambda nutzen), zumindest gibt es noch kein entsprechendes Sprachmittel.



  • Vielen herzlichen Dank euch beiden!
    ...ich habe zuvor echt noch nie etwas von "Lambda-Ausdrücken" gehört 😮



  • Lambda-Ausdrücke kommen aus der funktionalen Programmierung. Eine zentrale Möglichkeit entsprechender Programmiersprachen besteht darin, Funktionen höherer Ordnung (Funktionale) zu definieren, welche im Gegensatz zu normalen Funktionen nicht nur Werte, sondern auch andere Funktionen als Argumente nehmen können. Durch Lambda-Ausdrücke wird es möglich, eine Funktion gleich innerhalb des Aufrufs zu definieren.



  • Das sieht allerdings seltsam aus:

    [&cm = currentMonster]
    


  • David_pb schrieb:

    Das sieht allerdings seltsam aus:

    [&cm = currentMonster]
    

    Wahrscheinlich alte Syntax oder so. Atm sollte man das so schreiben können:

    [&currentMonster]
    

Anmelden zum Antworten