Lambda 関数の型推論の落とし穴
C では、型推論はコンパイラが変数の型を推論できる強力な機能であり、表現。ただし、ラムダ関数と std::function オブジェクトの処理に関しては課題が発生する可能性があります。
次の関数テンプレートを検討してください:
template<class A> set<A> filter(const set<A>& input, function<bool(A)> compare) { // Implementation omitted }
この関数をラムダ関数で呼び出す場合
filter(mySet, [](int i) { return i % 2 == 0; });
のように直接実行すると、呼び出しに一致する関数がないことを示すエラーが発生する場合があります。これは、型推定ではラムダ関数を std::function への直接引数として処理できないために発生します。
この理由は、ラムダ関数は厳密な意味では関数とみなされず、特定の関数を持つ関数オブジェクトであるためです。特性のセット。この標準では、ラムダを明示的なパラメータ型と、場合によっては関数ポインタを持つ std::function オブジェクトに変換できます。ただし、これによってこれらが std::function と同じレベルに昇格されるわけではありません。
この制限を回避するには、いくつかのアプローチが可能です。
std::function<bool(int)> func = [](int i) { return i % 2 == 0; }; set<int> myNewSet = filter(mySet, func);
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
template<class A, class CompareFunction> set<A> filter(const set<A>& input, CompareFunction compare) { // Implementation omitted } set<int> result = filter(myIntSet, [](int i) { i % 2 == 0; });
template<class Value, class CompareType, class IndexType> auto filter(const set<Value>& 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 サイトの他の関連記事を参照してください。