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

コンパイル時に C ラムダのパラメーターと戻り値の型を決定するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-25 17:53:11685ブラウズ

How Can I Determine the Parameter and Return Types of a C   Lambda at Compile Time?

ラムダのパラメータと戻り値の型の決定

ラムダが与えられた場合、コンパイルを使用してそのパラメータの型と戻り値の型を抽出することができます-タイムテクニック。これは、コンパイル時にラムダに関する情報にアクセスする方法を提供するラムダ トレイトを使用することで実現できます。

ラムダ トレイトを定義するには、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。