Heim >Backend-Entwicklung >C++ >Warum schlägt die C 11-Typableitung mit Lambdas in Funktionsvorlagen fehl?
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:
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
std::function<bool(int)> func = [](int i) { return i % 2 == 0; }; set<int> myNewSet = filter(mySet, func);
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!