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

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

Patricia Arquette
リリース: 2025-01-01 03:43:09
オリジナル
711 人が閲覧しました

Why Does Type Deduction Fail with Lambda Functions in C   Function Templates?

Lambda 関数の型推論の落とし穴

C では、型推論はコンパイラが変数の型を推論できる強力な機能であり、表現。ただし、ラムダ関数と std::function オブジェクトの処理に関しては課題が発生する可能性があります。

次の関数テンプレートを検討してください:

template<class A>
set<A> filter(const set<A>&amp; input, function<bool(A)> compare) {
    // Implementation omitted
}
ログイン後にコピー

この関数をラムダ関数で呼び出す場合

filter(mySet, [](int i) { return i % 2 == 0; });
ログイン後にコピー

のように直接実行すると、呼び出しに一致する関数がないことを示すエラーが発生する場合があります。これは、型推定ではラムダ関数を std::function への直接引数として処理できないために発生します。

この理由は、ラムダ関数は厳密な意味では関数とみなされず、特定の関数を持つ関数オブジェクトであるためです。特性のセット。この標準では、ラムダを明示的なパラメータ型と、場合によっては関数ポインタを持つ std::function オブジェクトに変換できます。ただし、これによってこれらが std::function と同じレベルに昇格されるわけではありません。

この制限を回避するには、いくつかのアプローチが可能です。

  1. ラムダから関数へオブジェクト:
std::function<bool(int)> func = [](int i) { return i % 2 == 0; };
set<int> myNewSet = filter(mySet, func);
ログイン後にコピー
  1. テンプレート タイプ引数を明示的に指定します:
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
ログイン後にコピー
  1. テンプレートを使用するクラス:
template<class A, class CompareFunction>
set<A> filter(const set<A>&amp; input, CompareFunction compare) {
    // Implementation omitted
}

set<int> result = filter(myIntSet, [](int i) { i % 2 == 0; });
ログイン後にコピー
  1. Dectype と Function Type を利用する 構文:
template<class Value, class CompareType, class IndexType>
auto filter(const set<Value>&amp; input, CompareType compare, IndexType index) -> map<decltype(index(*(input.begin()))), Value> {
    // Implementation omitted
}

map<string, int> s = filter(myIntSet, [](int i) { return i % 2 == 0; }, [](int i) { return toString(i); });
ログイン後にコピー

これらの戦略を採用することで、 C の型推論の制限を考慮しながら、ラムダ関数と std::function オブジェクトをうまく利用できます。 .

以上がC 関数テンプレートの Lambda 関数で型推定が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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