Вот одно решение, которое включает в себя упаковку ламбы в структуру:
template <typename T>
struct LamT
{
static void Go()
{
auto lam = []()
{
T var;
std::cout << "lam, type = " << typeid(var).name() << std::endl;
};
lam();
}
};
Чтобы использовать сделать:
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
Так что это не работает ... но даже если бы он действительно компилировался, он имел бы ограниченное использование, потому что нам все равно пришлось бы помещать "using LamdaT" в область видимости файла (потому что это шаблон), что в некотором роде противоречит цели лямбды.