Aquí hay una solución que implica envolver la lamba en una estructura:
template <typename T>
struct LamT
{
static void Go()
{
auto lam = []()
{
T var;
std::cout << "lam, type = " << typeid(var).name() << std::endl;
};
lam();
}
};
Para usar do:
LamT<int>::Go();
LamT<char>::Go();
#This prints
lam, type = i
lam, type = c
El problema principal con esto (además del tipeo adicional) no puede incrustar esta definición de estructura dentro de otro método u obtener (gcc 4.9)
error: a template declaration cannot appear at block scope
También intenté hacer esto:
template <typename T> using LamdaT = decltype(
[](void)
{
std::cout << "LambT type = " << typeid(T).name() << std::endl;
});
Con la esperanza de poder usarlo así:
LamdaT<int>();
LamdaT<char>();
Pero me sale el error del compilador:
error: lambda-expression in unevaluated context
Así que esto no funciona ... pero incluso si compilara, sería de uso limitado porque aún tendríamos que poner el "uso de LamdaT" en el alcance del archivo (porque es una plantilla) que de alguna manera frustra el propósito de lambdas