考慮構建類存儲函數的以下代碼。我想要這些函數被完美地轉發(不管它們是否是函數指針,函數,lambda表達式......)。但我不完全理解std::forward
和普遍引用背後發生的所有類型扣除。在上面的代碼,我有三個問題:功能的完美轉發以構建函數列表類
- 應該
_f
是std::tuple<F...>
型或std::tuple<F&&...>
的 - 是否可以推斷出模板參數列表中的返回類型
R
(因爲這樣做(爲什麼?)手動的,而不是auto/decltype(auto)
將有助於瞭解正在發生的事情) - 在製造商中,
function_list
模板參數應該是什麼?decltype(std::forward<F>(f)...)
,F
,或F&&...
(爲什麼)
注意:function_list
的構造函數並不是直接調用,而是make_function_list
正在完成這項工作。
編輯: 當這個案件的operator()
(這裏沒有顯示)不被保證在同一個陳述上被調用時,這種情況是否安全?
template <class... F>
constexpr function_list<F...> make_function_list(F&&... f)
{
return function_list<F&&...>(std::forward<F>(f)...);
}
你幾乎肯定會** **不希望他們是'˚F&&'。 – SergeyA
1)'tuple'2)您不需要模板列表中的'R',您已經知道返回類型是'function_list '3)'F &&',因爲它是一個轉發引用,它將rvalue和左值(你說你想要完美的轉發,所以這就是你如何得到它) –
AndyG
如果你可以保證函數調用操作符在與'make_function_list'相同的語句中被調用,你可以使用'F &&'(你可以在operator()') –