Heim > Backend-Entwicklung > C++ > Wie kann ich die Parameter- und Rückgabetypen eines Lambda-Ausdrucks in C abrufen?

Wie kann ich die Parameter- und Rückgabetypen eines Lambda-Ausdrucks in C abrufen?

Patricia Arquette
Freigeben: 2024-12-22 17:47:10
Original
935 Leute haben es durchsucht

How Can I Retrieve the Parameter and Return Types of a Lambda Expression in C  ?

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
Nach dem Login kopieren

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!
   //...
}
Nach dem Login kopieren

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(&amp;T::operator())>
{};
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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) {}.

funktioniert

Das 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!

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