Typableitung mit std::function und Lambda-Funktionen in C 11
Bei der Arbeit mit Vorlagen in C 11 kann die Typableitung eine sein leistungsstarke Funktion. Es gibt jedoch bestimmte Szenarien, in denen die Typableitung fehlschlägt, insbesondere wenn std::function- oder Lambda-Funktionen beteiligt sind.
Im folgenden Beispiel akzeptiert der Funktionstest einen Satz vom Typ A und gibt denselben Satz ohne explizite Angabe zurück Angabe des Vorlagentyps:
template<class A> set<A> test(const set<A>& input) { return input; }
Der Aufruf dieser Funktion mit test(mySet) an anderer Stelle im Code funktioniert wie erwartet. Wenn jedoch eine Funktion mit einer Lambda-Funktion verwendet wird, schlägt die Typableitung fehl:
template<class A> set<A> filter(const set<A>& input,function<bool(A)> compare) { // ... implementation }
Versuch, Filter mit filter(mySet,[](int i) { return i%2==0; }) aufzurufen ; führt zu folgendem Fehler:
error: no matching function for call to ‘filter(std::set&, main()::)’
Dieses Problem tritt auf, weil Lambdas keine Funktionen oder std::function-Objekte sind. Es handelt sich um Funktionsobjekte mit spezifischen, durch den Standard definierten Eigenschaften. Die Typableitung funktioniert nur mit exakten Typen, und Lambdas erfüllen dieses Kriterium nicht.
Um dieses Problem zu beheben, können Sie das Lambda in eine std::function konvertieren oder den Vorlagentyp explizit angeben:
// Convert lambda to std::function std::function<bool(int)> func = [](int i) { return i%2 ==0; }; set<int> myNewSet = filter(mySet,func); // Provide template type explicitly set<int> myNewSet = filter<int>(mySet,[](int i) { return i%2==0; });
Alternativ können Sie die Funktion neu definieren, um einen Vorlagenparameter für die CompareFunction zu akzeptieren:
template<class A,class CompareFunction> set<A> filter(const set<A>& input,CompareFunction compare) { // ... implementation }
Mit dieser Änderung können Sie die Funktion ohne aufrufen Angabe des Vorlagentyps:
set<int> result = filter(myIntSet,[](int i) { i % 2 == 0; });
Typableitung kann auch bei Lambdas mit mehreren Argumenten problematisch sein. In solchen Fällen kann die Verwendung von auto eine sinnvolle Lösung sein:
template<class Value,class CompareType,class IndexType> auto filter(const set<Value>& input,CompareType compare,IndexType index) -> map<decltype(index(*(input.begin()))),Value> { // ... implementation }
Diese Funktion kann wie folgt aufgerufen werden:
map<string,int> s = filter(myIntSet,[](int i) { return i%2==0; },[](int i) { return toString(i); });
Das obige ist der detaillierte Inhalt vonWarum schlägt die Typableitung mit std::function und Lambda-Funktionen in C 11 fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!