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
Patricia ArquetteOriginal
2024-12-22 17:47:10880Durchsuche

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

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(&amp;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) {}.

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!

Stellungnahme:
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