使用 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中文網其他相關文章!