Heim >Backend-Entwicklung >C++ >Warum schlägt die C 11-Typableitung mit Lambdas in Funktionsvorlagen fehl?

Warum schlägt die C 11-Typableitung mit Lambdas in Funktionsvorlagen fehl?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-04 09:00:35525Durchsuche

Why Does C  11 Type Deduction Fail with Lambdas in Function Templates?

C 11 Typabzugsbeschränkungen mit Lambda-Funktionen

Bei der Arbeit mit Lambda-Funktionen und std::function in C 11 ist der Typabzug möglicherweise nicht möglich wie erwartet ausgeführt werden, was zu Fehlern führt.

Die Problem

Berücksichtigen Sie die folgende Funktionsvorlage:

template<class A>
set<A> filter(const set<A>& input, function<bool(A)> compare);

Wenn Sie diese Funktion beispielsweise direkt mit einer Lambda-Funktion aufrufen:

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

Es wird ein Fehler angezeigt treten auf, weil der Compiler den Vorlagentyp nicht ableiten kann A.

Erklärung

Lamda-Funktionen bieten zwar eine praktische Syntax für anonyme Funktionen, sind aber unterschiedliche Typen, die die Methode „operator()“ implementieren. Sie werden nicht direkt durch die Typableitung unterstützt, die genaue Typen erwartet.

Lösungen

Es gibt mehrere Problemumgehungen, um dieses Problem zu beheben:

  • Vorlage explizit bereitstellen Typ:
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
  • **Erstellen Sie eine std::function:
std::function<bool(int)> func = [](int i) { return i % 2 == 0; };
set<int> myNewSet = filter(mySet, func);
  • Verwenden Sie eine modifizierte Funktionsvorlage:
template<class A, class CompareFunction>
set<A> filter(const set<A>& input, CompareFunction compare);

In dieser modifizierten Vorlage ist der Typ CompareFunction stellt ein Funktionsobjekt dar, das ein A-Argument annimmt und einen booleschen Wert zurückgibt. Der Vorlagenparameter wird nicht mehr abgeleitet, sondern explizit angegeben.

Zusätzliche Funktionen

Mit dem neuen Schlüsselwort decltype und der Syntax des Funktionsrückgabetyps kann die Funktion weiter verallgemeinert werden Bestimmen Sie automatisch den Rückgabetyp:

template<class Value, class CompareType, class IndexType>
auto filter(const set<Value>& input, CompareType compare, IndexType index) -> map<decltype(index(*(input.begin()))), Value> { ... }

Diese Vorlagenfunktion erwartet drei Typen: den Eingabesatzwerttyp, den Vergleichsfunktionstyp und die Indexfunktion Typ. Der Rückgabetyp wird automatisch ermittelt und instanziiert.

Das obige ist der detaillierte Inhalt vonWarum schlägt die C 11-Typableitung mit Lambdas in Funktionsvorlagen 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