[英]implementing a generic binary function with a class and functor as template parameters
[英]Implementing a Functor Template which can store its function's arguments
我想將任何類型的事件綁定到我正在開發的游戲的 (G)UI 系統的任何類型的函數。
我想在 Functor 模板類中存儲任何類型的函數及其初始參數,我可以將其綁定到信號綁定索引。 綁定到信號綁定的事件一旦出現在事件隊列中就會觸發它,這將導致所有綁定到該綁定的 Functor 被調用。
我發現存儲函數參數的方法是在函子模板中使用std::tuple
,但我需要幫助正確初始化它並在調用函數時正確解包。
這是我到目前為止:
template<typename R, typename... Args>
class FuncBinding {
private:
std::tuple<Args...> args;
R(*fun)(Args...);
public:
FuncBinding(R(*pF)(Args...) , Args... pArgs)
:fun(pF), args(std::make_tuple<Args...>(pArgs)) {}
R invoke() {
return fun(args...);
}
R callFunc(Args... pArgs) {
return fun(pArgs...);
}
};
我如何正確使用參數包Args
以便...
std::tuple<Args...>
適當std::tuple<Args...>
實例args
R(*fun)(Args...)
調用函數時解壓元組從初始化的角度來看, tuple
只是另一種類類型,因此您只需通過將包傳遞給其構造函數來初始化它:
FuncBinding(R(*pF)(Args...) , Args... pArgs)
: fun(pF), args(pArgs...)
{ }
或者,更有效地:
args(std::forward<Args>(pArgs)...)
我使用forward
而不是std::move()
以防某些Args...
是左值引用類型。
在調用方面,有一個名為std::apply()
的 C++17 函數可以執行您想要的操作:
R invoke() {
return std::apply(fun, args);
}
它可以在 C++11 中實現。 cppreference 頁面包含一個涉及std::make_index_sequence
的實現,它本身可以在 C++11 中實現(並且這個站點上有很多這樣的實現)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.