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...); }
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:
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; };
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!