在C 中,在不明確指定模板參數的情況下將lambda 轉換為std::function是一個挑戰。讓我們探討一下問題及其解決方案。
理解問題
在不指定模板參數的情況下定義 std::function 時,編譯器無法推斷 lambda 的類型爭論。這是因為 lambda 的類型取決於其參數的類型,而編譯器在模板實例化時不知道這些類型。
解決方案:身份類型
為了規避這個問題,我們可以將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...); }
這種方法允許我們將 lambda 傳遞給 func() 函數,而無需明確指定模板參數。
限制
但是,這個解有其限制:
替代方法
如果lambda 不捕獲變數並且您願意明確指定模板參數,則可以使用以下內容方法:
std::function<void()> f = [](int x, int y, int z) { std::cout << (x*y*z) << std::endl; };
這種方法比較簡單,並且在編譯時已知模板參數的情況下效果很好。
以上是如何在不明確指定範本參數的情況下將 Lambda 轉換為 C 中的「std::function」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!