Was ist der Typ einer Lambda-Funktion?

8

In C ++ 0x frage ich mich, was der Typ einer Lambda-Funktion ist. Speziell:

%Vor%

Was muss ich mit type1 / type2 ersetzen, damit das obige funktioniert? Hoffentlich können Sie sehen, was ich erreichen möchte. Selbst wenn dies nicht durch einen direkten Ersatz von Typ 1 und Typ 2 möglich ist, können Sie mich vielleicht in die richtige Richtung lenken.

Mit anderen Worten:

  • Wie kann ich eine Funktion erhalten, die eine anonyme Funktion zurückgibt?
  • Wie kann ich einer Variablen eine anonyme Funktion zuweisen?

Danke!

Bearbeiten: Ich kompiliere mit Visual Studio 2010

    
Cam 01.07.2010, 19:54
quelle

2 Antworten

14

Sie können den Typ der Lambda-Funktion nie kennen, da der Compiler logischerweise eine (lokale) Klasse generiert, bei der der Funktionsaufrufoperator überladen ist und eine lexikalische Schließung durch Datenelemente dieser (lokalen) Klasse dargestellt wird. Dies geschieht logisch für eine Lambda-Funktion wie:

%Vor%

Der Compiler führt das logischerweise aus:

%Vor%

Da der Compiler eine (lokale) Klasse generiert, generiert er einen Namen und kann daher den Typ nie explizit schreiben. Sie können den Typ nur aus Typabzügen von Template-Funktionsargumenten oder mit auto / declltype ableiten.

Auch C ++ 0x-Closures werden statisch zugewiesen, so dass Sie einen C ++ 0x-Closure-Thread sowieso nicht sicher zurückgeben können.

Es gibt immer noch einige Möglichkeiten, wie Sie das erreichen können, das erste ist flexibler und unterstützt Lambda-Funktionen, die lexikalische Bereiche erfassen. Verwenden Sie std :: function, wenn Sie eine Lambda-Funktion haben, die nichts aus dem äußeren Bereich erfasst, dann können Sie Funktionszeiger verwenden, aber diese Konvertierung ist mehr für die Arbeit mit Legacy-Code als alles andere.

Was Sie also wollen, ist folgendes:

%Vor%

Der Grund, warum ich logisch weiter sagte, ist, dass boost :: lambda so funktioniert (obwohl C ++ 03 keine lokalen Klassen in Template-Funktionsargumenten erlaubt) und wo die Idee des Hinzufügens liegt Lambda-Funktionen stammen von, aber da dies ein Sprachfeature ist, könnten Compilerhersteller es jetzt auf andere und effizientere Weise implementieren, wie wenn die gesamte Umgebung durch Verweis erfasst wird, kann der Compiler einfach einen Zeiger auf den Aufrufstapel anstatt auf den logischen Weg weiterleiten Aufrechterhaltung der logischen Sicht.

    
snk_kid 01.07.2010, 20:21
quelle
6

Von Wikipedia :

  

Lambda-Funktionen sind Funktionsobjekte eines implementierungsabhängigen Typs; Der Name dieses Typs steht nur dem Compiler zur Verfügung. Wenn der Benutzer eine Lambda-Funktion als Parameter verwenden möchte, muss der Typ ein Schablonentyp sein, oder er muss ein std::function erstellen, um den Lambda-Wert zu erfassen.

VC10 kompiliert das

%Vor%

und druckt

%Vor%     
sbi 01.07.2010 20:02
quelle