Spezialisieren einer Vorlage auf einem Lambda in C ++ 0x
Ich habe eine Traits-Klasse geschrieben, mit der ich Informationen über die Argumente und den Typ einer Funktion oder eines Funktionsobjekts in C ++ 0x extrahieren kann (getestet mit gcc 4.5.0). Der allgemeine Fall behandelt Funktionsobjekte:
template <typename F>
struct function_traits {
template <typename R, typename... A>
struct _internal { };
template <typename R, typename... A>
struct _internal<R (F::*)(A...)> {
// ...
};
typedef typename _internal<decltype(&F::operator())>::<<nested types go here>>;
};
Dann habe ich mich auf einfache Funktionen im globalen Bereich spezialisiert:
template <typename R, typename... A>
struct function_traits<R (*)(A...)> {
// ...
};
Dies funktioniert einwandfrei, ich kann eine Funktion in die Vorlage oder ein Funktionsobjekt übergeben und es funktioniert einwandfrei:
template <typename F>
void foo(F f) {
typename function_traits<F>::whatever ...;
}
int f(int x) { ... }
foo(f);
Was wäre wenn, anstatt eine Funktion oder ein Funktionsobjekt an @ zu übergebefoo
, Ich möchte einen Lambda-Ausdruck übergeben?
foo([](int x) { ... });
Das Problem hier ist, dass weder Spezialisierung vonfunction_traits<>
gilt. Der C ++ 0x-Entwurf besagt, dass der Typ des Ausdrucks ein "eindeutiger, unbenannter, nicht gewerkschaftlicher Klassentyp" ist. Das Ergebnis des Aufrufs von @ demangetypeid(...).name()
auf dem Ausdruck gibt mir anscheinend die interne Namenskonvention von gcc für das Lambda,main::{lambda(int)#1}
, nicht etwas, das syntaktisch einen C ++ - Typnamen darstellt.
Kurz gesagt, kann ich hier etwas in die Vorlage einfügen:
template <typename R, typename... A>
struct function_traits<????> { ... }
das wird dieser Traits-Klasse erlauben, einen Lambda-Ausdruck zu akzeptieren?