Heim >Backend-Entwicklung >C++ >Warum leitet C 11 bei der Verwendung von Lambda-Funktionen mit Funktionsvorlagen keine Typen ab?
Bei der Verwendung von C 11-Vorlagen oder Lambda-Funktionen ist es wichtig zu verstehen, wie die Typableitung funktioniert. In Fällen, in denen Sie eine Funktionsvorlage definieren, die eine std::function- oder Lambda-Funktion akzeptiert, kann der Compiler den Vorlagentyp möglicherweise nicht automatisch ableiten.
Betrachten Sie beispielsweise die folgende Funktion:
template<class A> set<A> filter(const set<A>& input, function<bool(A)> compare) { set<A> ret; for(auto it = input.begin(); it != input.end(); it++) { if(compare(*it)) { ret.insert(*it); } } return ret; }
Wenn Sie versuchen, diese Funktion direkt mit einer Lambda-Funktion aufzurufen, kann es zu einem Fehler kommen. Dies liegt daran, dass der Compiler den Vorlagentyp nicht allein aus der Lambda-Funktion ableiten kann:
set<int> myNewSet = filter(mySet,[](int i) { return i%2==0; });
Dieser Fehler kann vermieden werden, indem der Vorlagentyp explizit angegeben wird:
set<int> myNewSet = filter<int>(mySet,[](int i) { return i%2==0; });
Alternativ können Sie dies tun Konvertieren Sie die Lambda-Funktion in ein std::function-Objekt:
std::function<bool(int)> func = [](int i) { return i%2 ==0; }; set<int> myNewSet = filter(mySet,func);
In Fällen, in denen Sie eine Reihe von Werten basierend auf einem Vergleich filtern müssen Funktion können Sie eine allgemeinere Lösung bereitstellen, indem Sie eine Funktionsvorlage erstellen, die einen CompareFunction-Typ akzeptiert:
template<class Value,class CompareFunction> set<Value> filter(const set<Value>& input,CompareFunction compare) { set<Value> ret; for(auto it = input.begin(); it != input.end(); it++) { if(compare(*it)) { ret.insert(*it); } } return ret; }
Das obige ist der detaillierte Inhalt vonWarum leitet C 11 bei der Verwendung von Lambda-Funktionen mit Funktionsvorlagen keine Typen ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!