ラムダのパラメータと戻り値の型の決定
ラムダが与えられた場合、コンパイルを使用してそのパラメータの型と戻り値の型を抽出することができます-タイムテクニック。これは、コンパイル時にラムダに関する情報にアクセスする方法を提供するラムダ トレイトを使用することで実現できます。
ラムダ トレイトを定義するには、decltype 演算子を利用してラムダの演算子の署名を検査できます( )。この型にテンプレートを特化することで、パラメーターと戻り値の型を取得できます。
たとえば、次のコードはラムダ特性を実装しています。
template<typename T> struct lambda_traits : public lambda_traits<decltype(&T::operator())> { }; template<typename ReturnType, typename... Args> struct lambda_traits<ReturnType(Args...)> { using param_type = Args...; using return_type = ReturnType; };
これらの特性を使用すると、ラムダのパラメータと戻り値の型は次のとおりです:
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
このアプローチにより、std::function オブジェクトを動的に構築できます。次のコードで示されているように、ラムダから。
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; // Construct the std::function object }
このアプローチは、コンパイル時に正確な型を決定できないため、[](auto x) {} などの汎用ラムダでは失敗することに注意してください。時間です。
以上がコンパイル時に C ラムダのパラメーターと戻り値の型を決定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。