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<bool(int)> func = [](int i) { return i % 2 == 0; }; set<int> myNewSet = filter(mySet, func);
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中文網其他相關文章!