首頁 > 後端開發 > C++ > 為什麼「filter()」中的 Lambda 函數的 C 11 模板類型推導失敗?

為什麼「filter()」中的 Lambda 函數的 C 11 模板類型推導失敗?

DDD
發布: 2024-12-17 11:22:25
原創
896 人瀏覽過

Why Does C  11 Template Type Deduction Fail with Lambda Functions in `filter()`?

C 11 Lambda 函數的類型推導限制

C 11 允許模板類型推導,但在lambda 函數或std 時存在限制: :涉及到函數。當使用帶有模板參數的函數時,編譯器通常可以從參數類型推斷出模板類型。但是,當直接在參數中使用 lambda 時,此推導會失敗。

問題陳述

以下程式碼無法推導函數 filter() 的範本類型:

template<class A>
set<A> filter(const set<A>& input, function<bool(A)> compare) {
    // ...
}
登入後複製

當使用 lambda當函數作為比較參數直接呼叫此函數時,編譯器會引發錯誤:

filter(mySet, [](int i) { return i % 2 == 0; }); // Throws an error
登入後複製

錯誤原因

此錯誤的根本原因在於 lambda 函數的本質。雖然它們的行為類似於函數對象,但它們並不是真正的函數。 Lambda 函數不會隱式轉換為 std::function 對象,這將允許編譯器推斷類型。

解決方法

存在多種解決方法來解決推導問題:

1。明確範本參數:

明確指定範本參數:

filter<int>(mySet, [](int i) { return i % 2 == 0; });
登入後複製

2.建立一個std::function 物件:

將lambda 函數轉換為std::function物件並將其作為參數傳遞:

std::function<bool(int)> compare = [](int i) { return i % 2 == 0; };
filter(mySet, compare);
登入後複製

3.使用替代函數定義:

重新定義filter() 函數以接受通用比較函數物件:

template<class Value, class CompareType>
set<Value> filter(const set<Value>& input, CompareType compare) {
    // ...
}
登入後複製

現在,可以直接使用lambda 函數來呼叫函數:

filter(mySet, [](int i) { return i % 2 == 0; });
登入後複製

結論

Lambda函數提供了定義短期函數的便利方法,但它們可能會引入模板類型推導的複雜性。透過了解限制並使用適當的解決方法,開發人員可以有效地利用 C 11 程式碼中的 lambda。

以上是為什麼「filter()」中的 Lambda 函數的 C 11 模板類型推導失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板