Fallstricke bei der Typableitung mit Lambda-Funktionen
In C ist die Typableitung eine leistungsstarke Funktion, die es dem Compiler ermöglicht, auf die Typen von Variablen und abzuleiten Ausdrücke. Beim Umgang mit Lambda-Funktionen und std::function-Objekten kann es jedoch zu Herausforderungen kommen.
Berücksichtigen Sie die folgende Funktionsvorlage:
template<class A> set<A> filter(const set<A>& input, function<bool(A)> compare) { // Implementation omitted }
Wenn Sie diese Funktion mit einer Lambda-Funktion aufrufen direkt, wie zum Beispiel:
filter(mySet, [](int i) { return i % 2 == 0; });
Möglicherweise wird eine Fehlermeldung angezeigt, die besagt, dass für den Aufruf keine passende Funktion vorhanden ist. Dies liegt daran, dass die Typableitung die Lambda-Funktion nicht als direktes Argument für std::function verarbeiten kann.
Der Grund dafür ist, dass Lambda-Funktionen nicht als Funktionen im engeren Sinne betrachtet werden, sondern eher als Funktionsobjekte mit einem bestimmten Reihe von Merkmalen. Der Standard ermöglicht die Konvertierung von Lambdas in std::function-Objekte mit expliziten Parametertypen und in bestimmten Fällen Funktionszeigern. Dies hebt sie jedoch nicht auf das gleiche Niveau wie std::function.
Um diese Einschränkung zu umgehen, gibt es mehrere Ansätze, die Sie wählen können:
std::function<bool(int)> func = [](int i) { return i % 2 == 0; }; set<int> myNewSet = filter(mySet, func);
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
template<class A, class CompareFunction> set<A> filter(const set<A>& input, CompareFunction compare) { // Implementation omitted } set<int> result = filter(myIntSet, [](int i) { i % 2 == 0; });
template<class Value, class CompareType, class IndexType> auto filter(const set<Value>& input, CompareType compare, IndexType index) -> map<decltype(index(*(input.begin()))), Value> { // Implementation omitted } map<string, int> s = filter(myIntSet, [](int i) { return i % 2 == 0; }, [](int i) { return toString(i); });
Durch den Einsatz dieser Strategien können Sie Lambda-Funktionen und std::function-Objekte erfolgreich nutzen und dabei die Typableitungsbeschränkungen von C berücksichtigen.
Das obige ist der detaillierte Inhalt vonWarum schlägt die Typableitung bei Lambda-Funktionen in C-Funktionsvorlagen fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!