ホームページ > バックエンド開発 > C++ > `filter()` の Lambda 関数で C 11 テンプレートの型推定が失敗するのはなぜですか?

`filter()` の Lambda 関数で C 11 テンプレートの型推定が失敗するのはなぜですか?

DDD
リリース: 2024-12-17 11:22:25
オリジナル
896 人が閲覧しました

Why Does C  11 Template Type Deduction Fail with Lambda Functions in `filter()`?

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

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