Especializando um modelo em uma lambda em C ++ 0x

Eu escrevi uma classe de características que me permite extrair informações sobre os argumentos e o tipo de uma função ou objeto de função no C ++ 0x (testado com o gcc 4.5.0). O caso geral lida com objetos de função:

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>>;
};

Então, eu tenho uma especialização para funções simples no escopo global:

template <typename R, typename... A>
struct function_traits<R (*)(A...)> {
    // ...
};

Isso funciona bem, eu posso passar uma função para o modelo ou um objeto de função e funciona corretamente:

template <typename F>
void foo(F f) {
    typename function_traits<F>::whatever ...;
}

int f(int x) { ... }
foo(f);

E se, em vez de passar uma função ou objeto de função parafoo, Quero passar uma expressão lambda?

foo([](int x) { ... });

O problema aqui é que nenhuma especialização defunction_traits<> aplica-se. O rascunho do C ++ 0x diz que o tipo da expressão é "um tipo de classe exclusivo, sem nome e sem união". Desmantelar o resultado da chamadatypeid(...).name() na expressão me dá o que parece ser a convenção interna de nomes do gcc para o lambda,main::{lambda(int)#1}, não algo que represente sintaticamente um nome de tipo C ++.

Em suma, há algo que eu possa colocar no modelo aqui:

template <typename R, typename... A>
struct function_traits<????> { ... }

que permitirá que essa classe de características aceite uma expressão lambda?

questionAnswers(3)

yourAnswerToTheQuestion