Voici une solution qui consiste à envelopper le lamba dans une structure:
template <typename T>
struct LamT
{
static void Go()
{
auto lam = []()
{
T var;
std::cout << "lam, type = " << typeid(var).name() << std::endl;
};
lam();
}
};
Pour utiliser do:
LamT<int>::Go();
LamT<char>::Go();
#This prints
lam, type = i
lam, type = c
Le principal problème avec cela (en plus de la saisie supplémentaire), vous ne pouvez pas intégrer cette définition de structure dans une autre méthode ou vous obtenez (gcc 4.9)
error: a template declaration cannot appear at block scope
J'ai aussi essayé de faire ça:
template <typename T> using LamdaT = decltype(
[](void)
{
std::cout << "LambT type = " << typeid(T).name() << std::endl;
});
Avec l'espoir de pouvoir l'utiliser comme ceci:
LamdaT<int>();
LamdaT<char>();
Mais j'obtiens l'erreur du compilateur:
error: lambda-expression in unevaluated context
Donc, cela ne fonctionne pas ... mais même s'il compilait, cela serait d'une utilité limitée car nous aurions encore à mettre le "using LamdaT" à la portée du fichier (car c'est un modèle) qui défait en quelque sorte le but de lambdas.