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

為什麼 C 函數模板中的 Lambda 函數類型推導失敗?

Patricia Arquette
Patricia Arquette原創
2025-01-01 03:43:09724瀏覽

Why Does Type Deduction Fail with Lambda Functions in C   Function Templates?

Lambda 函數的類型推導陷阱

在C 中,類型推導是一個強大的功能,它允許編譯器推斷變數的類型並表達式。但是,在處理 lambda 函數和 std::function 物件時,它可能會遇到挑戰。

考慮以下函數模板:

template<class A>
set<A> filter(const set<A>&amp; 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 相同的水平。

要規避此限制,您可以採取多種方法:

  1. 將函數的Lambda物件:
std::function<bool(int)> func = [](int i) { return i % 2 == 0; };
set<int> myNewSet = filter(mySet, func);
  1. 明確提供範本類型參數:
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
  1. 使用模板類別:
template<class A, class CompareFunction>
set<A> filter(const set<A>&amp; input, CompareFunction compare) {
    // Implementation omitted
}

set<int> result = filter(myIntSet, [](int i) { i % 2 == 0; });
  1. 利用Dectype 和函數型語法:
template<class Value, class CompareType, class IndexType>
auto filter(const set<Value>&amp; 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn