C 11 テンプレートまたは Lambda 関数を使用する場合、型推定がどのように機能するかを理解することが重要です。 std::function または lambda 関数を受け入れる関数テンプレートを定義する場合、コンパイラーはテンプレートの型を自動的に推定できない可能性があります。
たとえば、次の関数について考えてみましょう:
template<class A> set<A> filter(const set<A>& input, function<bool(A)> compare) { set<A> ret; for(auto it = input.begin(); it != input.end(); it++) { if(compare(*it)) { ret.insert(*it); } } return ret; }
ラムダ関数を使用してこの関数を直接呼び出そうとすると、エラーが発生する可能性があります。これは、コンパイラがラムダ関数だけからテンプレートの型を推測できないためです:
set<int> myNewSet = filter(mySet,[](int i) { return i%2==0; });
このエラーは、テンプレートの型を明示的に指定することで回避できます:
set<int> myNewSet = filter<int>(mySet,[](int i) { return i%2==0; });
または、次のようにすることもできます。ラムダ関数を std::function オブジェクトに変換します:
std::function<bool(int)> func = [](int i) { return i%2 ==0; }; set<int> myNewSet = filter(mySet,func);
必要な場合比較関数に基づいて値のセットをフィルタリングするには、CompareFunction 型を受け入れる関数テンプレートを作成することで、より一般的なソリューションを提供できます。
template<class Value,class CompareFunction> set<Value> filter(const set<Value>& input,CompareFunction compare) { set<Value> ret; for(auto it = input.begin(); it != input.end(); it++) { if(compare(*it)) { ret.insert(*it); } } return ret; }
以上が関数テンプレートで Lambda 関数を使用するときに C 11 が型を推定しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。