Ecco una soluzione che prevede il wrapping della lamba in una struttura:
template <typename T>
struct LamT
{
static void Go()
{
auto lam = []()
{
T var;
std::cout << "lam, type = " << typeid(var).name() << std::endl;
};
lam();
}
};
Per usare do:
LamT<int>::Go();
LamT<char>::Go();
#This prints
lam, type = i
lam, type = c
Il problema principale con questo (oltre alla digitazione extra) non è possibile incorporare questa definizione di struttura in un altro metodo o si ottiene (gcc 4.9)
error: a template declaration cannot appear at block scope
Ho anche provato a fare questo:
template <typename T> using LamdaT = decltype(
[](void)
{
std::cout << "LambT type = " << typeid(T).name() << std::endl;
});
Con la speranza di poterlo usare in questo modo:
LamdaT<int>();
LamdaT<char>();
Ma ottengo l'errore del compilatore:
error: lambda-expression in unevaluated context
Quindi questo non funziona ... ma anche se fosse compilato sarebbe di utilità limitata perché dovremmo ancora mettere "l'utilizzo di LamdaT" nell'ambito del file (perché è un modello) che in qualche modo sconfigge lo scopo di lambda.