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?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage