Ich spielte mit dem Lambda "überladen" wie dargestellt here, und kam schnell zu dem Punkt, wo ich es bequem finden würde, spezialisierte Lambda-Verschlüsse zu erstellen. So war ich zum ersten Mal Trial-and-error'ing ein bisschen mit meiner vielversprechendsten StudieC++ spezialisieren einen Lambda für einen bestimmten Typ
seineauto call_for_vector = [] template<typename T> (std::vector<T>) {};
jedoch ein später Blick auf den cppreference zeigte, dass weder dieses noch ähnliche Konstrukte scheinen von der Norm erlaubt zu werden.
Aus welchem Grund werden solche Spezialisierungen nicht unterstützt?
Ich weiß, dass man dieses Verhalten mit SFINAE erhalten kann, aber dann ist es weniger lesbar, schwerer zu schreiben und fehleranfälliger. Natürlich kann man simpy auch eine Klasse mit einem geeigneten operator()
schreiben, aber das ist soo C++ 03 :-)
Welche Verwendung für eine solche Syntax wäre ?:
ein Beispiel, würde dies für eine einfache Lambda „Überlast“, wie im folgenden Code erlaubt
template <class F1, class F2>
struct overload_set : F1, F2
{
overload_set(F1 x1, F2 x2) : F1(x1), F2(x2) {}
using F1::operator();
using F2::operator();
};
template <class F1, class F2>
overload_set<F1,F2> overload(F1 x1, F2 x2)
{
return overload_set<F1,F2>(x1,x2);
}
auto f = overload(
[](auto&& x){ std::cout<<"call by default"<<std::endl;},
[] template<typename T>(std::vector<T>){std::cout<<"call for vector"<<std::endl;}
);
One dieses Verhalten erhalten kann zB mit SFINAE Basis auf die Technik in this answer, aber wieder ... das ist scheiße.
Gibt es eine einfache Problemumgehung für SFINAE, um bestimmte Überladungen zu erhalten?
Nun, ich denke, dass Sie mit std :: function famillar sind, die die Art ist, mit dauerhaften Funktionen zu arbeiten. Ich denke, Lambdas sind flüchtig in dem Sinne, dass der Standard nicht möchte, dass Sie sie speichern, wie es ist –
@David Haim: das obige funktioniert auch nicht mit 'std :: function', da es eine bestimmte Signatur benötigt. – davidhigh
können Sie std :: function, 'template std :: function templatetize –