ラムダのパラメータと戻り値の型の取得
ラムダ式では、パラメータと戻り値の型を決定することが、ラムダを引数として受け入れる関数にとって不可欠です。このタスクの実現可能性とそれを達成するためのアプローチを検討してみましょう。
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(&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 サイトの他の関連記事を参照してください。