Ось одне рішення, яке передбачає вкручування ягняти в структуру:
template <typename T>
struct LamT
{
static void Go()
{
auto lam = []()
{
T var;
std::cout << "lam, type = " << typeid(var).name() << std::endl;
};
lam();
}
};
Щоб використовувати do:
LamT<int>::Go();
LamT<char>::Go();
#This prints
lam, type = i
lam, type = c
Основна проблема з цим (окрім додаткового набору тексту), ви не можете вбудувати це визначення структури в інший метод, або ви отримаєте (gcc 4.9)
error: a template declaration cannot appear at block scope
Я також спробував це зробити:
template <typename T> using LamdaT = decltype(
[](void)
{
std::cout << "LambT type = " << typeid(T).name() << std::endl;
});
З надією, що я міг би використати це так:
LamdaT<int>();
LamdaT<char>();
Але я отримую помилку компілятора:
error: lambda-expression in unevaluated context
Отже, це не працює ... але навіть якщо він компілював, це було б обмеженим використанням, тому що нам все одно доведеться поставити "використання LamdaT" у область файлу (тому що це шаблон), яка ніби перемагає мету лямбда.