Lambda 函數的類型推導陷阱
在C 中,類型推導是一個強大的功能,它允許編譯器推斷變數的類型並表達式。但是,在處理 lambda 函數和 std::function 物件時,它可能會遇到挑戰。
考慮以下函數模板:
template<class A> set<A> filter(const set<A>& input, function<bool(A)> compare) { // Implementation omitted }
使用lambda 函數調用此函數時直接調用,如:
filter(mySet, [](int i) { return i % 2 == 0; });
您可能會遇到錯誤,指出調用沒有匹配的函數。出現這種情況是因為類型推導無法將 lambda 函數作為 std::function 的直接參數處理。
原因是 lambda 函數不被視為嚴格意義上的函數,而是具有特定意義的函數物件。一組特徵。此標準允許將 lambda 轉換為具有明確參數類型的 std::function 對象,在某些情況下還可以轉換為函數指針。然而,這並沒有將它們提升到與 std::function 相同的水平。
要規避此限制,您可以採取多種方法:
std::function<bool(int)> func = [](int i) { return i % 2 == 0; }; set<int> myNewSet = filter(mySet, func);
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
template<class A, class CompareFunction> set<A> filter(const set<A>& input, CompareFunction compare) { // Implementation omitted } set<int> result = filter(myIntSet, [](int i) { i % 2 == 0; });
template<class Value, class CompareType, class IndexType> auto filter(const set<Value>& input, CompareType compare, IndexType index) -> map<decltype(index(*(input.begin()))), Value> { // Implementation omitted } map<string, int> s = filter(myIntSet, [](int i) { return i % 2 == 0; }, [](int i) { return toString(i); });透過採用🎜>透過採用🎜>透過採用🎜>
以上是為什麼 C 函數模板中的 Lambda 函數類型推導失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!