Hier ist eine Lösung, bei der das 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:
LamT<int>::Go();
LamT<char>::Go();
#This prints
lam, type = i
lam, type = c
Das Hauptproblem dabei ist (neben der zusätzlichen Typisierung), dass Sie diese Strukturdefinition nicht in eine andere Methode einbetten können, sonst erhalten Sie (gcc 4.9)
error: a template declaration cannot appear at block scope
Ich habe auch dies versucht:
template <typename T> using LamdaT = decltype(
[](void)
{
std::cout << "LambT type = " << typeid(T).name() << std::endl;
});
Mit der Hoffnung, dass ich es so nutzen kann:
LamdaT<int>();
LamdaT<char>();
Aber ich erhalte den Compilerfehler:
error: lambda-expression in unevaluated context
Das funktioniert also nicht ... aber selbst wenn es sich kompilieren ließe, wäre es von begrenztem von begrenztem Nutzen, weil wir immer noch das "using LamdaT" in den Dateiscope setzen müssten (weil es sich um eine Vorlage handelt), was den Zweck von Lambdas in gewisser Weise zunichte macht.
0 Stimmen
Gibt es einen Anwendungsfall, bei dem eine Lambda-Vorlage nützlich wäre?
13 Stimmen
James: Sie könnten eine Funktion erstellen, die über ein Tupel iteriert (nicht unbedingt nützlich).
0 Stimmen
Ich kam auf die Idee, als ich ein Interview von Stroustrup las, in dem er über die Komplexität von Meta-Templates sprach, die ein Problem darstellt. Wenn es erlaubt wäre, stellte ich mir den Ninja-Code-Fu vor, der von allzu cleveren Programmierern erfunden werden könnte, die mit dieser Funktionskombination spielen...
2 Stimmen
Lustig, historische Meinungen von vor einem Jahrzehnt zu sehen.
0 Stimmen
In der Tat. Jetzt verstehe ich, wie nützlich das sein kann. Ich kann auch sehen, wie es missbraucht werden kann, aber das können alle nützlichen Werkzeuge :grimacing: