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
Freigeben: 2025-01-04 09:00:35
Original
550 Leute haben es durchsucht

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

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

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

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; });
Nach dem Login kopieren
  • **Erstellen Sie eine std::function:
std::function<bool(int)> func = [](int i) { return i % 2 == 0; };
set<int> myNewSet = filter(mySet, func);
Nach dem Login kopieren
  • Verwenden Sie eine modifizierte Funktionsvorlage:
template<class A, class CompareFunction>
set<A> filter(const set<A>& input, CompareFunction compare);
Nach dem Login kopieren

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> { ... }
Nach dem Login kopieren

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!

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