Hier ist eine Lösung, bei der die Lamba in eine Struktur eingewickelt wird:
template <typename T>
struct LamT
{
static void Go()
{
auto lam = []()
{
T var;
std::cout << "lam, type = " << typeid(var).name() << std::endl;
};
lam();
}
};
Zu verwenden tun:
LamT<int>::Go();
LamT<char>::Go();
#This prints
lam, type = i
lam, type = c
Das Hauptproblem dabei (neben der zusätzlichen Eingabe) ist, dass Sie diese Strukturdefinition nicht in eine andere Methode einbetten können oder dass Sie (gcc 4.9) erhalten.
error: a template declaration cannot appear at block scope
Ich habe auch versucht, dies zu tun:
template <typename T> using LamdaT = decltype(
[](void)
{
std::cout << "LambT type = " << typeid(T).name() << std::endl;
});
In der Hoffnung, dass ich es so gebrauchen könnte:
LamdaT<int>();
LamdaT<char>();
Aber ich bekomme den Compilerfehler:
error: lambda-expression in unevaluated context
Das funktioniert also nicht ... aber selbst wenn es kompiliert würde, wäre es von begrenztem Nutzen, da wir immer noch das "using LamdaT" in den Dateibereich stellen müssten (weil es eine Vorlage ist), was den Zweck von zunichte macht Lambdas.