ホームページ >バックエンド開発 >C++ >関数テンプレートで Lambda 関数を使用するときに C 11 が型を推定しないのはなぜですか?

関数テンプレートで Lambda 関数を使用するときに C 11 が型を推定しないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-17 21:04:10453ブラウズ

Why Doesn't C  11 Deduce Types When Using Lambda Functions with Function Templates?

関数または Lambda 関数が関与する場合、C 11 は型を推定しない

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。