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?