首頁 >後端開發 >C++ >如何使用範本有效地將通用 C Lambda 轉換為 std::function?

如何使用範本有效地將通用 C Lambda 轉換為 std::function?

Linda Hamilton
Linda Hamilton原創
2024-12-09 11:03:08797瀏覽

How Can I Efficiently Convert a Generic C   Lambda to an std::function Using Templates?

使用模板將Lambda 轉換為std::function

在C 中,使用模板將lambda 函數轉換為std::function 可以是一項具有挑戰性的任務。為了實現這一點,模板類型推導是必不可少的,但在某些情況下它可能會面臨限制。

最初,嘗試將 lambda 轉換為 std::function 可能會因為缺少模板參數或候選匹配不匹配而失敗。若要解決此問題,請明確指定範本參數,如 std::function 所示。 f([]) 就足夠了。但是,對於針對任何參數類型和計數的 lambda 的通用程式碼來說,這種方法並不可取。

要解決此問題,需要更細緻的解決方案。雖然模板類型推導無​​法直接從 lambda 推斷 std::function 模板參數,但仍可以透過提供額外的類型限制來引導。

考慮以下方法:將 lambda 函數包裝在結構體恆等

template <typename T>
struct identity
{
  typedef T type;
};

template <typename... T>
void func(typename identity<std::function<void(T...)>>::type f, T... values) {
  f(values...);
}
std::function>,其中 T 可以從 lambda 參數推導出來。這個結構體充當身分類型,允許 lambda 作為參數傳遞,無需任何類型轉換。

int main() {
  func([](int x, int y, int z) { std::cout << (x*y*z) << std::endl; }, 3, 6, 8);
  return 0;
}
現在,當呼叫 func 時,std::function 的範本參數可以從身分結構。這消除了顯式模板參數規範或額外參數傳遞的需要。

這種方法滿足將泛型lambda 轉換為std::function 的要求,無需顯式指定模板參數,並允許對可變參數進行柯里化通過保留原始lambda 簽名來運行函數。

以上是如何使用範本有效地將通用 C Lambda 轉換為 std::function?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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