Wie funktioniert generisches Lambda in C ++ 14?
Wie funktioniert generischen lambda-Arbeit (auto
Stichwort als argument-Typ) in C++14-standard?
Ist es, basierend auf C++ - templates, in denen für jeden unterschiedlichen argument-Typ der compiler erzeugt eine neue Funktion mit dem gleichen Körper, sondern ersetzt-Typen (compile-Zeit-Polymorphismus), oder ist es eher ähnlich zu Java ' s generics (type erasure)?
Code Beispiel:
auto glambda = [](auto a) { return a; };
InformationsquelleAutor der Frage sasha.sochka | 2013-06-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Generische Lambda-Ausdrücke eingeführt wurden, in
C++14
.Einfach, der Verschluss Typ definiert durch den lambda-Ausdruck wird ein Vorlagen call operator statt der regulären, nicht-template-Aufruf-operator von
C++11
's lambdas (natürlich, wennauto
erscheint mindestens einmal in der Parameterliste).Also dein Beispiel:
Machen
glambda
eine Instanz dieses Typs:Absatz 5.1.2/5 des C++14-Standard-Entwurf n3690 angibt, wie der Anruf Betreiber der Verschluss Typ einer gegebenen lambda-Ausdruck definiert ist:
Schließlich:
Als der obige Absatz erklärt, generische lambdas sind nur syntaktischer Zucker für einzigartige, Unbenannte funktoren mit einer Vorlagen-Aufruf-operator. Das sollte Ihre Frage beantworten 🙂
InformationsquelleAutor der Antwort Andy Prowl
LeiderSie sind nicht Teil von C++11 (http://ideone.com/NsqYuq):
Mit g++ 4.7:
Jedochwie es sein könnte implementiert in C++14 als pro die Portland Vorschlag für generische lambdas:
Dies ergäbe für den größten Teil der üblichen Erstellung von einem anonymen functor-Klasse, aber mit dem Mangel an Typen, die der compiler emittieren würde eine Vorlagen-Mitglied-
operator()
:Oder gemäß der neueren Vorschlag Vorschlag für Generische (Polymorphe) Lambda-Ausdrücke
Also ja, für jede permutation der Parameter, eine neue Instanziierung entstehen würde, jedoch die Mitglieder der functor würde noch geteilt werden (D. H. die erfassten Argumente).
InformationsquelleAutor der Antwort Sebastian Mach
Es ist eine geplante C++14-Funktion (nicht in C++11) ähnliche (oder auch äquivalent) Vorlagen. Zum Beispiel, N3559 bietet in diesem Beispiel:
InformationsquelleAutor der Antwort Cassio Neri