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 サイトの他の関連記事を参照してください。