UPDATE 2018: C++20 wird mit schablonierten und konzeptualisierten Lambdas kommen. Die Funktion wurde bereits in den Standardentwurf integriert.
UPDATE 2014: C++14 wurde dieses Jahr veröffentlicht und bietet nun polymorphe Lambdas mit der gleichen Syntax wie in diesem Beispiel. Einige wichtige Compiler implementieren sie bereits.
Zum jetzigen Zeitpunkt (in C++11) leider nicht. Polymorphe Lambdas wären im Hinblick auf Flexibilität und Leistung ausgezeichnet.
Der ursprüngliche Grund dafür, dass sie monomorph sind, waren die Konzepte. Die Konzepte machten diese Codesituation schwierig:
template <Constraint T>
void foo(T x)
{
auto bar = [](auto x){}; // imaginary syntax
}
In einer eingeschränkten Vorlage können Sie nur andere eingeschränkte Vorlagen aufrufen. (Andernfalls könnten die Beschränkungen nicht überprüft werden.) Kann foo
aufrufen. bar(x)
? Welche Einschränkungen hat das Lambda (der Parameter dafür ist ja nur eine Vorlage)?
Die Konzepte waren nicht bereit, diese Art von Dingen in Angriff zu nehmen; es würde mehr Dinge erfordern wie late_check
(wobei das Konzept erst beim Aufruf geprüft wurde) und so weiter. Einfacher war es, das alles fallen zu lassen und bei monomorphen Lambdas zu bleiben.
Mit der Abschaffung der Konzepte in C++0x werden polymorphe Lambdas jedoch wieder zu einem einfachen Vorschlag. Ich kann jedoch keine Vorschläge dafür finden :(
0 Stimmen
Gibt es einen Anwendungsfall, bei dem eine Lambda-Vorlage nützlich wäre?
13 Stimmen
James: Sie könnten eine Funktion erstellen, die über ein Tupel iteriert (nicht unbedingt nützlich).
0 Stimmen
Ich kam auf die Idee, als ich ein Interview von Stroustrup las, in dem er über die Komplexität von Meta-Templates sprach, die ein Problem darstellt. Wenn es erlaubt wäre, stellte ich mir den Ninja-Code-Fu vor, der von allzu cleveren Programmierern erfunden werden könnte, die mit dieser Funktionskombination spielen...
2 Stimmen
Lustig, historische Meinungen von vor einem Jahrzehnt zu sehen.
0 Stimmen
In der Tat. Jetzt verstehe ich, wie nützlich das sein kann. Ich kann auch sehen, wie es missbraucht werden kann, aber das können alle nützlichen Werkzeuge :grimacing: