Heim > Backend-Entwicklung > C++ > Warum schlägt die Typableitung mit std::function und Lambda-Funktionen in C 11 fehl?

Warum schlägt die Typableitung mit std::function und Lambda-Funktionen in C 11 fehl?

Mary-Kate Olsen
Freigeben: 2024-12-20 05:50:10
Original
325 Leute haben es durchsucht

Why Does Type Deduction Fail with std::function and Lambda Functions in C  11?

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>&amp; input) {
    return input;
}
Nach dem Login kopieren

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>&amp; input,function<bool(A)> compare) {
    // ... implementation
}
Nach dem Login kopieren

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&amp;, main()::)’
Nach dem Login kopieren

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; });
Nach dem Login kopieren

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>&amp; input,CompareFunction compare) {
    // ... implementation
}
Nach dem Login kopieren

Mit dieser Änderung können Sie die Funktion ohne aufrufen Angabe des Vorlagentyps:

set<int> result = filter(myIntSet,[](int i) { i % 2 == 0; });
Nach dem Login kopieren

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>&amp; input,CompareType compare,IndexType index) -> map<decltype(index(*(input.begin()))),Value> {
    // ... implementation
}
Nach dem Login kopieren

Diese Funktion kann wie folgt aufgerufen werden:

map<string,int> s = filter(myIntSet,[](int i) { return i%2==0; },[](int i) { return toString(i); });
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage