C 11 Lambda 関数での型推定の制限
C 11 ではテンプレートの型推定が可能ですが、lambda 関数または std の場合には制限があります。 :関数が関係しています。テンプレート パラメーターを含む関数を使用する場合、コンパイラーは多くの場合、引数の型からテンプレートの型を推測できます。ただし、引数でラムダを直接使用すると、この推定は失敗します。
問題ステートメント
次のコードは、関数 filter() のテンプレート タイプの推定に失敗します。
template<class A> set<A> filter(const set<A>& input, function<bool(A)> compare) { // ... }
比較引数としてラムダ関数を使用してこの関数を直接呼び出すと、コンパイラはerror:
filter(mySet, [](int i) { return i % 2 == 0; }); // Throws an error
エラーの理由
このエラーの根本原因は、ラムダ関数の性質にあります。これらは関数オブジェクトのように動作しますが、真の関数ではありません。 Lambda 関数は暗黙的に std::function オブジェクトに変換されないため、コンパイラーは型を推測できます。
回避策
推測の問題を解決するには、いくつかの回避策が存在します。 :
1.明示的なテンプレート引数:
テンプレート引数を明示的に指定します:
filter<int>(mySet, [](int i) { return i % 2 == 0; });
2. std::function オブジェクトを作成します:
ラムダ関数を std::function オブジェクトに変換し、パラメータとして渡します:
std::function<bool(int)> compare = [](int i) { return i % 2 == 0; }; filter(mySet, compare);
3.代替関数定義を使用します:
一般的な比較関数オブジェクトを受け入れるように filter() 関数を再定義します:
template<class Value, class CompareType> set<Value> filter(const set<Value>& input, CompareType compare) { // ... }
これで、ラムダ関数を使用して関数を呼び出すことができます直接:
filter(mySet, [](int i) { return i % 2 == 0; });
結論
Lambda 関数は、有効期間の短い関数を定義する便利な方法を提供しますが、テンプレートの型推定に関して複雑さが生じる可能性があります。制限を理解し、適切な回避策を使用することで、開発者は C 11 コードでラムダを効果的に活用できます。
以上が`filter()` の Lambda 関数で C 11 テンプレートの型推定が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。