繁体   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