2010-11-05 3 views
5

Wie ist es möglich, auf die Typen der Parameter einer Lambda-Funktion in C++ zuzugreifen? Folgendes funktioniert nicht:Wie kann ich auf die Typen eines Lambda in C++ 0x zugreifen?

template <class T> struct capture_lambda { 
}; 

template <class R, class T> struct capture_lambda<R(T)> { 
    static void exec() { 
    } 
}; 

template <class T> void test(T t) { 
    capture_lambda<T>::exec(); 
} 

int main() { 
    test([](int i)->int{ return 0; }); 
} 

Das obige kompiliert nicht, da der Compiler den Template-Prototyp statt der Spezialisierung wählt.

Gibt es eine Möglichkeit, das Obige zu tun?

Was ich eigentlich versuche zu erreichen, ist dies: Ich habe eine Liste von Funktionen, und ich möchte die entsprechende Funktion zum Aufrufen auswählen. Beispiel:

template <class T, class ...F> void exec(T t, F... f...) { 
    //select the appropriate function from 'F' to invoke, based on match with T. 
} 

Zum Beispiel möchte ich die Funktion aufzurufen, die ‚int‘ nimmt:

exec(1, [](char c){ printf("Error"); }, [](int i){ printf("Ok"); }); 
+1

Ich frage nach einer etwas breiteren Sicht: Welches Problem versuchen Sie mit der 'exec' Funktion zu lösen? Klingt ein bisschen hässlich. – GManNickG

+0

Ich versuche, einen algebraischen Unionstyp zu machen. – axilmar

+0

Überladungsauflösung für beliebige Funktionsobjekttypen ... Ich kann mir keinen Weg vorstellen, dies zu tun. Wenn sie ihre Param-Typen exportieren würden, könnte es gemacht werden. Sonst habe ich keine Ahnung. –

Antwort

2

Dies ist nicht möglich, Lambda-Funktionen sind syntaktischer Zucker für die Funktion der Erstellung nicht eigentlichen Funktionen Objekte. Dies bedeutet, dass die Vorlage eine Klasse akzeptiert, und Klassen haben nicht das Konzept Argumenttyp.

Denken Sie auch daran, dass ein allgemeines Funktionsobjekt eine beliebige Anzahl von überladenen operator() s haben kann.

Verwandte Themen