Вот одно решение, которое включает в себя упаковку ламбы в структуру:
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
Так что это не сработает ... но даже если оно скомпилируется, оно будет ограничено
использовать, потому что мы все равно должны поставить «использование LamdaT» в области видимости файла
(потому что это шаблон), который побеждает назначение лямбд.