Aqui está uma solução que envolve envolver o lamba em uma estrutura:
template <typename T>
struct LamT
{
static void Go()
{
auto lam = []()
{
T var;
std::cout << "lam, type = " << typeid(var).name() << std::endl;
};
lam();
}
};
Para usar faça:
LamT<int>::Go();
LamT<char>::Go();
#This prints
lam, type = i
lam, type = c
O principal problema com isso (além da digitação extra) você não pode incorporar essa definição de estrutura em outro método ou obter (gcc 4.9)
error: a template declaration cannot appear at block scope
Eu também tentei fazer isso:
template <typename T> using LamdaT = decltype(
[](void)
{
std::cout << "LambT type = " << typeid(T).name() << std::endl;
});
Com a esperança de poder usá-lo assim:
LamdaT<int>();
LamdaT<char>();
Mas eu recebo o erro do compilador:
error: lambda-expression in unevaluated context
Portanto, isso não funciona ... mas mesmo que fosse compilado, seria de uso limitado, porque ainda precisaríamos colocar o "using LamdaT" no escopo do arquivo (porque é um modelo) que meio que derrota o objetivo de lambdas.