Heim > Backend-Entwicklung > C++ > Warum schlägt die Typableitung bei Lambda-Funktionen in C-Funktionsvorlagen fehl?

Warum schlägt die Typableitung bei Lambda-Funktionen in C-Funktionsvorlagen fehl?

Patricia Arquette
Freigeben: 2025-01-01 03:43:09
Original
700 Leute haben es durchsucht

Why Does Type Deduction Fail with Lambda Functions in C   Function Templates?

Fallstricke bei der Typableitung mit Lambda-Funktionen

In C ist die Typableitung eine leistungsstarke Funktion, die es dem Compiler ermöglicht, auf die Typen von Variablen und abzuleiten Ausdrücke. Beim Umgang mit Lambda-Funktionen und std::function-Objekten kann es jedoch zu Herausforderungen kommen.

Berücksichtigen Sie die folgende Funktionsvorlage:

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

Wenn Sie diese Funktion mit einer Lambda-Funktion aufrufen direkt, wie zum Beispiel:

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

Möglicherweise wird eine Fehlermeldung angezeigt, die besagt, dass für den Aufruf keine passende Funktion vorhanden ist. Dies liegt daran, dass die Typableitung die Lambda-Funktion nicht als direktes Argument für std::function verarbeiten kann.

Der Grund dafür ist, dass Lambda-Funktionen nicht als Funktionen im engeren Sinne betrachtet werden, sondern eher als Funktionsobjekte mit einem bestimmten Reihe von Merkmalen. Der Standard ermöglicht die Konvertierung von Lambdas in std::function-Objekte mit expliziten Parametertypen und in bestimmten Fällen Funktionszeigern. Dies hebt sie jedoch nicht auf das gleiche Niveau wie std::function.

Um diese Einschränkung zu umgehen, gibt es mehrere Ansätze, die Sie wählen können:

  1. Konvertieren Sie die Lambda zu einem Funktionsobjekt:
std::function<bool(int)> func = [](int i) { return i % 2 == 0; };
set<int> myNewSet = filter(mySet, func);
Nach dem Login kopieren
  1. Stellen Sie das bereit Argument für Vorlagentyp Explizit:
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
Nach dem Login kopieren
  1. Verwenden Sie eine Vorlagenklasse:
template<class A, class CompareFunction>
set<A> filter(const set<A>&amp; input, CompareFunction compare) {
    // Implementation omitted
}

set<int> result = filter(myIntSet, [](int i) { i % 2 == 0; });
Nach dem Login kopieren
  1. Verwenden Sie Dectype und Function Type Syntax:
template<class Value, class CompareType, class IndexType>
auto filter(const set<Value>&amp; input, CompareType compare, IndexType index) -> map<decltype(index(*(input.begin()))), Value> {
    // Implementation omitted
}

map<string, int> s = filter(myIntSet, [](int i) { return i % 2 == 0; }, [](int i) { return toString(i); });
Nach dem Login kopieren

Durch den Einsatz dieser Strategien können Sie Lambda-Funktionen und std::function-Objekte erfolgreich nutzen und dabei die Typableitungsbeschränkungen von C berücksichtigen.

Das obige ist der detaillierte Inhalt vonWarum schlägt die Typableitung bei Lambda-Funktionen in C-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