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
Mary-Kate OlsenOriginal
2024-12-20 05:50:10327Durchsuche

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;
}

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
}

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()::)’

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>&amp; 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>&amp; 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!

Stellungnahme:
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