Einführung:
Lambda-Ausdrücke bieten eine prägnante und bequeme Möglichkeit dazu Definieren Sie anonyme Funktionen in C. Bei der Arbeit mit Variadic-Vorlagen kann die Übergabe von Lambdas jedoch eine Herausforderung darstellen. In diesem Artikel wird eine Technik zum Konvertieren generischer Lambdas in std::functions mithilfe von Template-Metaprogrammierung untersucht.
Vorlagenbasierte std::function-Konvertierung:
Um die Konvertierung von zu ermöglichen B. ein Lambda mit beliebigen Parametern für eine std::function, können wir uns nicht auf die Ableitung des Vorlagentyps verlassen. Stattdessen verwenden wir einen Identitätstyp, um die Lambda-Funktion zu umschließen und ihre Typinformationen beizubehalten:
template <typename T> struct identity { typedef T type; };
Mit diesem Identitätstyp erstellen wir eine generische Funktion, die das umschlossene Lambda als Argument akzeptiert:
template <typename... T> void func(typename identity<std::function<void(T...)>>::type f, T... values) { f(values...); }
Beispielverwendung:
Während dieser Ansatz keine explizite Angabe von Vorlagenparametern erfordert, beinhaltet er die Übergabe zusätzliche Argumente für die Funktion. Hier ist ein Beispiel:
func([](int x, int y, int z) { std::cout << (x*y*z) << std::endl; }, 3, 6, 8);
Fazit:
Während diese Lösung die Herausforderung der Konvertierung generischer Lambdas in std::functions im Kontext variadischer Vorlagen angeht, ist sie erfordert die Übergabe zusätzlicher Argumente. Alternativ kann man eine explizite Vorlagenparameterspezifikation verwenden oder alternative Ansätze wie die Verwendung von Funktionszeigern oder einem Funktionsobjekt-Wrapper in Betracht ziehen.
Das obige ist der detaillierte Inhalt vonWie können generische Lambdas mithilfe von Vorlagen in C in std::functions konvertiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!