ホームページ > バックエンド開発 > C++ > C でラムダ式のパラメータと戻り値の型を取得するにはどうすればよいですか?

C でラムダ式のパラメータと戻り値の型を取得するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-22 17:47:10
オリジナル
878 人が閲覧しました

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

ラムダのパラメータと戻り値の型の取得

ラムダ式では、パラメータと戻り値の型を決定することが、ラムダを引数として受け入れる関数にとって不可欠です。このタスクの実現可能性とそれを達成するためのアプローチを検討してみましょう。

Lambda Traits

ラムダのパラメータと戻り値の型を取得するには、次のように定義することが提案されています。次のように使用できる lambda_traits テンプレート:

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
ログイン後にコピー

を活用することでlambda_traits 関数は、パラメータをイントロスペクトし、引数として受け取ったラムダの型を返すことができ、次のような高度な機能を有効にします。

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!
   //...
}
ログイン後にコピー

decltype を使用してパラメータの型をイントロスペクトする

幸いなことに、ラムダのoperator()のdecltypeを使用してパラメータの型を取得することができます。この手法は、次の function_traits 実装でエレガントに実証されています。

template <typename T>
struct function_traits
    : public function_traits<decltype(&amp;T::operator())>
{};
ログイン後にコピー

汎用ラムダの場合、function_traits は、operator() のシグネチャを直接使用します。メンバー関数ポインターの場合、arity、result_type、および引数の型を特殊化して提供します。

使用例

次の例を考えてみましょう:

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;
}
ログイン後にコピー

この例は、function_traits を利用してラムダの予期されるパラメーターと戻り値の型を検証する方法を示しています。このアプローチは、[](auto x) {} のような汎用ラムダでは機能しない可能性があることに注意してください。

以上がC でラムダ式のパラメータと戻り値の型を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート