ホームページ > バックエンド開発 > C++ > テンプレートを使用して汎用 C Lambda を std::function に効率的に変換するにはどうすればよいですか?

テンプレートを使用して汎用 C Lambda を std::function に効率的に変換するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-09 11:03:08
オリジナル
809 人が閲覧しました

How Can I Efficiently Convert a Generic C   Lambda to an std::function Using Templates?

テンプレートを使用した Lambda から std::function への変換

C では、テンプレートを使用して lambda 関数を std::function に変換できます。やりがいのある仕事。これを達成するには、テンプレートの型推定が不可欠ですが、特定のシナリオでは制限に直面する可能性があります。

最初は、テンプレート パラメーターが欠落しているか、候補マッチングの不一致により、ラムダを std::function に変換しようとすると失敗する可能性があります。 。これを解決するには、 std::function にあるように、テンプレート パラメーターを明示的に指定します。 f([])、で十分でしょう。ただし、このアプローチは、任意のパラメーターの型と数のラムダを対象とする汎用コードには望ましくありません。

この問題に対処するには、より微妙なソリューションが必要です。テンプレート型推論ではラムダから std::function テンプレート パラメーターを直接推論できませんが、追加の型制約を提供することで誘導できます。

次のアプローチを検討してください。構造体 ID でラムダ関数をラップします。

template <typename T>
struct identity
{
  typedef T type;
};

template <typename... T>
void func(typename identity<std::function<void(T...)>>::type f, T... values) {
  f(values...);
}
ログイン後にコピー
std::function> ここで、T はラムダ パラメーターから推定できます。この構造体は ID 型として機能し、型変換を行わずにラムダを引数として渡すことができます。

int main() {
  func([](int x, int y, int z) { std::cout << (x*y*z) << std::endl; }, 3, 6, 8);
  return 0;
}
ログイン後にコピー
func を呼び出すときに、std::function のテンプレート パラメーターをアイデンティティ構造。これにより、明示的なテンプレート パラメーターの指定や追加の引数の受け渡しが不要になります。

このアプローチは、テンプレート パラメーターを明示的に指定せずに汎用ラムダを std::function に変換する要件を満たし、可変個引数のカリー化を可能にします。元のラムダ署名を保持して関数を実行します。

以上がテンプレートを使用して汎用 C Lambda を std::function に効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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