Oto jedno rozwiązanie, które polega na zawinięciu lamby w strukturę:
template <typename T>
struct LamT
{
static void Go()
{
auto lam = []()
{
T var;
std::cout << "lam, type = " << typeid(var).name() << std::endl;
};
lam();
}
};
Aby użyć:
LamT<int>::Go();
LamT<char>::Go();
#This prints
lam, type = i
lam, type = c
Głównym problemem z tym (oprócz dodatkowego pisania) jest to, że nie możesz osadzić tej definicji struktury w innej metodzie lub dostajesz (gcc 4.9)
error: a template declaration cannot appear at block scope
Próbowałem też to zrobić:
template <typename T> using LamdaT = decltype(
[](void)
{
std::cout << "LambT type = " << typeid(T).name() << std::endl;
});
Z nadzieją, że mógłbym to wykorzystać w ten sposób:
LamdaT<int>();
LamdaT<char>();
Ale pojawia się błąd kompilatora:
error: lambda-expression in unevaluated context
Więc to nie działa ... ale nawet gdyby się skompilowało, miałoby to ograniczone zastosowanie, ponieważ nadal musielibyśmy umieścić „używanie LamdaT” w zakresie plików (ponieważ jest to szablon), co w pewnym sensie nie spełnia celu lambdas.