Heim >Backend-Entwicklung >C++ >Wie kann ich die Parameter- und Rückgabetypen eines Lambda-Ausdrucks in C abrufen?
Parameter- und Rückgabetypen von Lambdas abrufen
In Lambda-Ausdrücken kann die Bestimmung von Parameter- und Rückgabetypen für Funktionen, die Lambdas als Argumente akzeptieren, von entscheidender Bedeutung sein. Lassen Sie uns die Machbarkeit dieser Aufgabe und den Ansatz zu ihrer Lösung untersuchen.
Lambda-Eigenschaften
Um die Parameter- und Rückgabetypen eines Lambda zu erhalten, wird vorgeschlagen, diese zu definieren eine lambda_traits-Vorlage, die wie folgt verwendet werden kann:
auto lambda = [](int i) { return long(i*10); }; lambda_traits<decltype(lambda)>::param_type i; //i should be int lambda_traits<decltype(lambda)>::return_type l; //l should be long
Durch die Nutzung von lambda_traits können Funktionen die introspizieren Parameter- und Rückgabetypen von Lambdas, die als Argumente empfangen werden, wodurch erweiterte Funktionen wie:
template<typename TLambda> void f(TLambda lambda) { typedef typename lambda_traits<TLambda>::param_type P; typedef typename lambda_traits<TLambda>::return_type R; std::function<R(P)> fun = lambda; //I want to do this! //... }
Verwenden von decltype zur Introspektion von Parametertypen
Glücklicherweise ist es möglich, Parameter abzurufen Typen unter Verwendung des decltype des Lambda-Operators(). Diese Technik wird in der folgenden function_traits-Implementierung elegant demonstriert:
template <typename T> struct function_traits : public function_traits<decltype(&T::operator())> {};
Für generische Lambdas verwendet function_traits direkt die Signatur ihres Operator(). Für Mitgliedsfunktionszeiger ist es spezialisiert und stellt Aritäts-, Ergebnistyp- und Argumenttypen bereit.
Beispielverwendung
Betrachten Sie das folgende Beispiel:
int main() { auto lambda = [](int i) { return long(i*10); }; typedef function_traits<decltype(lambda)> traits; static_assert(std::is_same<long, traits::result_type>::value, "err"); static_assert(std::is_same<int, traits::arg<0>::type>::value, "err"); return 0; }
Dieses Beispiel veranschaulicht, wie function_traits verwendet wird, um die erwarteten Parameter- und Rückgabetypen eines Lambda zu überprüfen. Beachten Sie, dass dieser Ansatz möglicherweise nicht für generische Lambdas wie [](auto x) {}.
funktioniertDas obige ist der detaillierte Inhalt vonWie kann ich die Parameter- und Rückgabetypen eines Lambda-Ausdrucks in C abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!