Gibt es in C ++ 11 eine Möglichkeit, eine Lambda-Funktion vorzulegen? Oder ist es von Natur aus zu spezifisch, um als Vorlage verwendet zu werden?
Ich verstehe, dass ich stattdessen eine klassische Klasse / einen klassischen Funktor mit Vorlagen definieren kann, aber die Frage lautet eher: Erlaubt die Sprache das Schablonieren von Lambda-Funktionen?
Antworten:
UPDATE 2018: C ++ 20 wird mit Vorlagen und konzeptionierten Lambdas geliefert. Die Funktion wurde bereits in den Standardentwurf integriert.
UPDATE 2014: C ++ 14 wurde in diesem Jahr veröffentlicht und bietet polymorphen Lambdas jetzt die gleiche Syntax wie in diesem Beispiel. Einige große Compiler implementieren es bereits.
Daran steht (in C ++ 11) leider nein. Polymorphe Lambdas wären hinsichtlich Flexibilität und Leistung ausgezeichnet.
Der ursprüngliche Grund, warum sie monomorph waren, waren Konzepte. Konzepte machten diese Codesituation schwierig:
In einer eingeschränkten Vorlage können Sie nur andere eingeschränkte Vorlagen aufrufen. (Andernfalls konnten die Einschränkungen nicht überprüft werden.) Kann
foo
aufgerufen werdenbar(x)
? Welche Einschränkungen hat das Lambda (der Parameter dafür ist schließlich nur eine Vorlage)?Konzepte waren nicht bereit, solche Dinge anzugehen; Es würde mehr Dinge wie
late_check
(wo das Konzept erst beim Aufrufen überprüft wurde) und Dinge erfordern . Einfacher war es, alles fallen zu lassen und sich an monomorphe Lambdas zu halten.Mit der Entfernung von Konzepten aus C ++ 0x werden polymorphe Lambdas jedoch wieder zu einer einfachen Aussage. Ich kann jedoch keine Vorschläge dafür finden. :((
quelle
C ++ 11-Lambdas können nicht wie in anderen Antworten angegeben als Vorlage verwendet werden,
decltype()
scheinen jedoch bei der Verwendung eines Lambda innerhalb einer Klasse oder Funktion mit Vorlagen hilfreich zu sein.Drucke:
Ich habe festgestellt, dass diese Technik bei der Arbeit mit Vorlagencode hilfreich ist, aber ich erkenne, dass Lambdas selbst immer noch keine Vorlagen enthalten können.
quelle
T
würdedecltype(t)
in diesem Beispiel gut funktionieren .In C ++ 11 können Lambda-Funktionen nicht als Vorlage verwendet werden. In der nächsten Version des ISO C ++ - Standards (häufig als C ++ 14 bezeichnet) wird diese Funktion eingeführt. [Quelle]
Anwendungsbeispiel:
Beachten Sie, dass die Syntax zwar das Schlüsselwort verwendet
auto
, der Typabzug jedoch nicht die Regeln desauto
Typabzugs verwendet, sondern die Regeln des Vorlagenargumentabzugs. Siehe auch den Vorschlag für generische Lambda-Ausdrücke (und das Update dazu).quelle
auto
Typabzug sind speziell so definiert, dass sie mit denen für dentemplate
Funktionsargumentabzug identisch sind .Mir ist bekannt, dass es sich bei dieser Frage um C ++ 11 handelt. Für diejenigen, die auf dieser Seite gegoogelt und gelandet sind, werden Lambdas mit Vorlagen jetzt in C ++ 14 unterstützt und heißen Generic Lambdas.
[info] Die meisten gängigen Compiler unterstützen diese Funktion jetzt. Microsoft Visual Studio 2015 unterstützt. Clang unterstützt. GCC unterstützt.
quelle
Ich frage mich, was ist damit:
Ich habe ähnlichen Code wie diesen verwendet, um eine Vorlage zu generieren und mich zu fragen, ob der Compiler die "Wrapping" -Funktion optimieren wird.
quelle
Werfen Sie einen Blick auf Boost.Phoenix für polymorphe Lambdas: http://www.boost.org/doc/libs/1_44_0/libs/spirit/phoenix/doc/html/index.html Benötigt kein C ++ 0x Weg :)
quelle
Es gibt eine gcc-Erweiterung , die Lambda-Vorlagen ermöglicht :
wo
_widgets
ist einstd::tuple< fusion::pair<Key_T, Widget_T>... >
quelle
Ich habe mit dem neuesten Clang-
version 5.0.1
Kompilieren mit der-std=c++17
Flagge gespielt und es gibt jetzt eine nette Unterstützung für Auto-Typparameter für Lambdas:quelle
Hier ist eine Lösung, bei der die Lamba in eine Struktur eingewickelt wird:
Zu verwenden tun:
Das Hauptproblem dabei (neben der zusätzlichen Eingabe) ist, dass Sie diese Strukturdefinition nicht in eine andere Methode einbetten können oder dass Sie (gcc 4.9) erhalten.
Ich habe auch versucht, dies zu tun:
In der Hoffnung, dass ich es so gebrauchen könnte:
Aber ich bekomme den Compilerfehler:
Das funktioniert also nicht ... aber selbst wenn es kompiliert würde, wäre es von begrenztem Nutzen, da wir immer noch das "using LamdaT" in den Dateibereich stellen müssten (weil es eine Vorlage ist), was den Zweck von zunichte macht Lambdas.
quelle
Ich bin nicht sicher, warum dies niemand anderes vorgeschlagen hat, aber Sie können eine Vorlagenfunktion schreiben, die Lambda-Funktionen zurückgibt. Folgendes hat mein Problem gelöst, der Grund, warum ich auf diese Seite gekommen bin:
Wann immer ich eine Funktion möchte, die einen bestimmten Argumenttyp (z. B.
std::string
) akzeptiert, sage ich einfachund
f("any string")
kehrt jetzt zurück1.0
.Das ist ein Beispiel für das, was ich unter "Lambda-Funktion mit Vorlagen" verstehe. (Dieser spezielle Fall wird verwendet, um automatisch eine inerte Gewichtungsfunktion bereitzustellen, wenn jemand seine Daten nicht gewichten möchte, unabhängig von seinen Daten.)
quelle