ホームページ > バックエンド開発 > C++ > テンプレートパラメータを明示的に指定せずに、ラムダを C の `std::function` に変換するにはどうすればよいですか?

テンプレートパラメータを明示的に指定せずに、ラムダを C の `std::function` に変換するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-04 12:58:09
オリジナル
827 人が閲覧しました

How Can I Convert Lambdas to `std::function` in C   Without Explicitly Specifying Template Parameters?

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

C では、テンプレート パラメーターを明示的に指定せずに lambda を std::function に変換するのは困難です。問題とその解決策を見てみましょう。

問題を理解する

テンプレート パラメーターを指定せずに std::function を定義すると、コンパイラーはラムダの型を推測できません。口論。これは、ラムダの型がパラメータの型に依存しており、テンプレートのインスタンス化時にコンパイラには未知であるためです。

解決策: ID 型

この問題を回避するには、ラムダを 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...);
}
ログイン後にコピー

このアプローチにより、テンプレート パラメーターを明示的に指定せずに、ラムダを func() 関数に渡すことができます。

制限事項

ただし、このソリューションには次のような制限があります。

  • 次のことが必要です。追加の引数を関数に渡しますが、これはすべてのシナリオで望ましいとは限りません。
  • ラムダが周囲のスコープから変数をキャプチャする場合は処理できません。

代替アプローチ

ラムダが変数をキャプチャせず、テンプレート パラメーターを明示的に指定したい場合は、次のアプローチを使用できます:

std::function<void()> f = [](int x, int y, int z) { std::cout << (x*y*z) << std::endl; };
ログイン後にコピー

この方法はより簡単で、コンパイル時にテンプレート パラメーターがわかっている場合にうまく機能します。

以上がテンプレートパラメータを明示的に指定せずに、ラムダを C の `std::function` に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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