使用模板將Lambda 轉換為std::function
在C 中,使用模板將lambda 函數轉換為std::function 可以是一項具有挑戰性的任務。為了實現這一點,模板類型推導是必不可少的,但在某些情況下它可能會面臨限制。
最初,嘗試將 lambda 轉換為 std::function 可能會因為缺少模板參數或候選匹配不匹配而失敗。若要解決此問題,請明確指定範本參數,如 std::function
要解決此問題,需要更細緻的解決方案。雖然模板類型推導無法直接從 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
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中文網其他相關文章!