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