Heim > Backend-Entwicklung > C++ > Warum schlägt die Ableitung des C 11-Vorlagentyps mit Lambda-Funktionen in „filter()' fehl?

Warum schlägt die Ableitung des C 11-Vorlagentyps mit Lambda-Funktionen in „filter()' fehl?

DDD
Freigeben: 2024-12-17 11:22:25
Original
892 Leute haben es durchsucht

Why Does C  11 Template Type Deduction Fail with Lambda Functions in `filter()`?

C 11-Typabzugsbeschränkungen mit Lambda-Funktionen

C 11 ermöglicht den Vorlagentypabzug, es gibt jedoch Einschränkungen, wenn Lambda-Funktionen oder std: :function sind beteiligt. Bei der Verwendung von Funktionen mit Vorlagenparametern kann der Compiler häufig aus den Argumenttypen auf den Vorlagentyp schließen. Diese Ableitung schlägt jedoch fehl, wenn Lambdas direkt im Argument verwendet werden.

Problemstellung

Der folgende Code kann den Vorlagentyp für die Funktion filter() nicht ableiten:

template<class A>
set<A> filter(const set<A>& input, function<bool(A)> compare) {
    // ...
}
Nach dem Login kopieren

Wenn diese Funktion direkt mit einer Lambda-Funktion als Vergleichsargument aufgerufen wird, löst der Compiler eine aus Fehler:

filter(mySet, [](int i) { return i % 2 == 0; }); // Throws an error
Nach dem Login kopieren

Grund für den Fehler

Die Hauptursache dieses Fehlers liegt in der Natur der Lambda-Funktionen. Obwohl sie sich wie Funktionsobjekte verhalten, sind sie keine echten Funktionen. Lambda-Funktionen werden nicht implizit in std::function-Objekte konvertiert, was es dem Compiler ermöglichen würde, den Typ abzuleiten.

Problemumgehungen

Es gibt mehrere Problemumgehungen, um das Abzugsproblem zu lösen :

1. Explizites Vorlagenargument:

Geben Sie das Vorlagenargument explizit an:

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

2. Erstellen Sie ein std::function-Objekt:

Konvertieren Sie die Lambda-Funktion in ein std::function-Objekt und übergeben Sie es als Parameter:

std::function<bool(int)> compare = [](int i) { return i % 2 == 0; };
filter(mySet, compare);
Nach dem Login kopieren

3. Alternative Funktionsdefinition verwenden:

Definieren Sie die Funktion filter() neu, um ein allgemeines Vergleichsfunktionsobjekt zu akzeptieren:

template<class Value, class CompareType>
set<Value> filter(const set<Value>& input, CompareType compare) {
    // ...
}
Nach dem Login kopieren

Jetzt kann die Funktion direkt mit einer Lambda-Funktion aufgerufen werden:

filter(mySet, [](int i) { return i % 2 == 0; });
Nach dem Login kopieren

Fazit

Lambda-Funktionen bieten eine bequeme Möglichkeit zur Definition Kurzlebige Funktionen, aber sie können die Ableitung des Vorlagentyps komplex machen. Durch das Verständnis der Einschränkungen und die Verwendung geeigneter Problemumgehungen können Entwickler Lambdas im C 11-Code effektiv nutzen.

Das obige ist der detaillierte Inhalt vonWarum schlägt die Ableitung des C 11-Vorlagentyps mit Lambda-Funktionen in „filter()' 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage