簡體   English   中英

實現一個可以存儲其函數參數的函子模板

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM