实现可以存储其函数参数的函子模板

问题描述 投票:2回答:1

我想为我正在开发的游戏的(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...)调用函数时,将元组解包>

我想将任何类型的事件绑定到我正在开发的游戏(G)UI系统的任何类型的函数。我想将任何类型的函数及其初始参数存储在Functor ...

c++ user-interface c++11 templates variadic-functions
1个回答
3
投票

A tuple从初始化的角度来看只是另一个类类型,因此您只需通过将包传递给其构造函数来对其进行初始化:

© www.soinside.com 2019 - 2024. All rights reserved.