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) { // ... }
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
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; });
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);
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) { // ... }
Jetzt kann die Funktion direkt mit einer Lambda-Funktion aufgerufen werden:
filter(mySet, [](int i) { return i % 2 == 0; });
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!