Ein Lambda ist kein Funktionszeiger! Ein Lambda ist eine Instanz der vom Compiler erzeugten Klasse!
Jedoch kann ein nicht erfassendes Lambda mit seiner operator+
Hier ist ein Beispiel:
%Vor% Leider funktioniert das operator+
in Ihrem Fall nicht einmal, weil es nicht als consExpr deklariert wurde, Sie können es also nicht in einem Template-Parameter verwenden.
Eine Lösung für Ihren Fall wäre die Verwendung einer kostenlosen Funktion ... bis N4487 nicht akzeptiert wird, Sie können nicht erwarten, Lambda als Vorlageparameter zu übergeben.
Eine andere Lösung wäre, einen eigenen Funktor anstelle eines Lambda zu erstellen:
%Vor% Diese Lösung ist nicht sehr ansprechend, aber es könnte nützlich sein, wenn LambdaType
in einer cpp-Datei versteckt ist.
Wenn Ihr Ziel nur der Compiler ist, um Ihren Code in Zeilen zu fassen, können Sie Vorlagen verwenden, um das Lambda herumzugeben:
%Vor% Da der Compiler den Typ von T
für jede Instanz kennt, sollte ein guter Compiler das Lambda optimieren können.
Mit clang gibt die dritte Option die folgende Assembly:
%Vor% Ich habe -std=c++14 -Ofast -march=native
als Flags verwendet.
Dies liegt daran, dass das Lambda ein eigener Typ ist.
Sie haben templaize function()
für den Typ der übergebenen Funktion.
Ich weiß nicht genug von dem Standard, um zu sagen, ob dies mein Compiler-Fehler ist, der es nicht richtig implementiert, oder wenn es eigentlich der Standard ist, aber mit VS2015 kann man keinen Konstanten-Lambda-Ausdruck zur Kompilierungszeit erzeugen. Und Vorlagen nehmen nur Kompilierzeitkonstanten, also keine Lambdas.
Sie müssen jedoch nicht als Vorlage verwenden, wenn Sie ein Lambda übergeben möchten. Es ist vollkommen möglich ohne:
%Vor%