首頁 > 後端開發 > C++ > 為什麼在函數範本中使用 Lambda 時 C 11 類型推導會失敗?

為什麼在函數範本中使用 Lambda 時 C 11 類型推導會失敗?

Patricia Arquette
發布: 2025-01-04 09:00:35
原創
519 人瀏覽過

Why Does C  11 Type Deduction Fail with Lambdas in Function Templates?

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

在C 11 中使用lambda 函數和std::function 時,類型推導可能不會如預期執行,導致錯誤。

問題

考慮以下函數模板:

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

直接使用 lambda當函數呼叫此函數時,例如:

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

將出現錯誤由於編譯器無法推斷模板類型而發生A.

說明

Lamda 函數雖然為匿名函數提供了方便的語法,但它們是實作operator() 方法的不同型別。它們不受類型推導的直接支持,而類型推導需要精確的類型。

解決方案

有幾種解決方法來解決此問題:

  • 明確提供模板類型:
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);
登入後複製
  • 使用修改後的功能template:
template<class A, class CompareFunction>
set<A> filter(const set<A>& input, CompareFunction compare);
登入後複製

在此修改後的在範本中,CompareFunction 類型表示採用A 參數並傳回布林值的函數物件。模板參數不再推導,而是明確指定。

附加功能

使用新的decltype 關鍵字和函數傳回型別語法,函數可以進一步泛化為自動判斷回傳類型:

template<class Value, class CompareType, class IndexType>
auto filter(const set<Value>& input, CompareType compare, IndexType index) -> map<decltype(index(*(input.begin()))), Value> { ... }
登入後複製

此範本函數需要三種類型:輸入設定值類型、比較函數類型和索引函數類型。傳回類型自動確定並實例化。

以上是為什麼在函數範本中使用 Lambda 時 C 11 類型推導會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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