首頁 >後端開發 >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;
}

如果您嘗試直接使用 lambda 函數呼叫此函數,您可能會遇到錯誤。這是因為編譯器無法單獨從lambda 函數推導出模板類型:

set<int> myNewSet = filter(mySet,[](int i) { return i%2==0; });

可以透過明確指定模板類型來避免此錯誤:

set<int> myNewSet = filter<int>(mySet,[](int i) { return i%2==0; });

或者,您可以將lambda 函數轉換為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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn