Heim > Backend-Entwicklung > C++ > Wie kann ich Lambdas in C in „std::function' konvertieren, ohne explizit Vorlagenparameter anzugeben?

Wie kann ich Lambdas in C in „std::function' konvertieren, ohne explizit Vorlagenparameter anzugeben?

Susan Sarandon
Freigeben: 2024-12-04 12:58:09
Original
810 Leute haben es durchsucht

How Can I Convert Lambdas to `std::function` in C   Without Explicitly Specifying Template Parameters?

Lambdas mit Vorlagen in std::function konvertieren

In C stellt die Konvertierung eines Lambda in eine std::function ohne explizite Angabe von Vorlagenparametern eine Herausforderung dar. Lassen Sie uns das Problem und seine Lösung untersuchen.

Das Problem verstehen

Beim Definieren einer std::function ohne Angabe von Vorlagenparametern kann der Compiler den Typ des Lambda nicht ableiten Argument. Dies liegt daran, dass der Typ des Lambda von den Typen seiner Parameter abhängt, die dem Compiler zum Zeitpunkt der Vorlageninstanziierung unbekannt sind.

Die Lösung: Identitätstyp

Um dieses Problem zu umgehen, können wir das Lambda in einen Identitätstyp einschließen, der abhängige Typen während der Vorlagentypableitung ignoriert. Hier ist ein Beispiel:

template <typename T>
struct identity
{
  typedef T type;
};

template <typename... T>
void func(typename identity<std::function<void(T...)>>::type f, T... values) {
  f(values...);
}
Nach dem Login kopieren

Dieser Ansatz ermöglicht es uns, ein Lambda an die Funktion func() zu übergeben, ohne die Vorlagenparameter explizit anzugeben.

Einschränkungen

Diese Lösung weist jedoch Einschränkungen auf:

  • Sie erfordert die Übergabe zusätzlicher Argumente an die Funktion, was möglicherweise der Fall ist nicht in allen Szenarien wünschenswert sein.
  • Es kann nicht den Fall bewältigen, in dem das Lambda Variablen aus dem umgebenden Bereich erfasst.

Alternativer Ansatz

Wenn das Lambda keine Variablen erfasst und Sie bereit sind, die Vorlagenparameter explizit anzugeben, können Sie Folgendes verwenden Ansatz:

std::function<void()> f = [](int x, int y, int z) { std::cout << (x*y*z) << std::endl; };
Nach dem Login kopieren

Diese Methode ist einfacher und funktioniert gut, wenn die Vorlagenparameter zur Kompilierungszeit bekannt sind.

Das obige ist der detaillierte Inhalt vonWie kann ich Lambdas in C in „std::function' konvertieren, ohne explizit Vorlagenparameter anzugeben?. 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