私が取り組んでいるゲームの(G)UIシステム用のあらゆる種類の関数に任意の種類のイベントをバインドしたいと思います。関数の引数を格納できるFunctorテンプレートの実装
私はシグナルバインディングインデックスにバインドすることができるFunctorテンプレートクラスに任意の種類の関数とその初期引数を格納したいと思います。シグナルバインディングにバインドされたイベントは、イベントキューに表示されるとトリガーされ、このバインディングにバインドされたすべてのFunctorsが呼び出されます。
関数の引数を格納する方法は、ファンクタテンプレートでstd::tuple
を使用することでしたが、関数を呼び出すときに正しく初期化して適切にアンパックする必要があります。
この
は、私がこれまで持っているものです。- 私がするために正しくパラメータパック
Args
を使用するにはどうすればよい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...); } };
を... ...テンプレートクラスを作成
std::tuple<Args...>
appropiately - ...
std::tuple<Args...>
インスタンスargs
をファンクション引数で初期化 - ...アンパックth
FuncBinding(R(*pF)(Args...) , Args... pArgs) : fun(pF), args(pArgs...) { }
:あなたはちょうどそのコンストラクタにパックを渡して、それを初期化するように、関数ポインタを通じて関数を呼び出すEタプルは
R(*fun)(Args...)
可能(https://stackoverflow.com/questions/7858817/unpacking-a-tuple-to-call-a-matching-function-pointer/20441189#20441189)。 – Walter