C++ 具有可变模板的委托

C++ 具有可变模板的委托,c++,templates,variadic-templates,C++,Templates,Variadic Templates,当事件触发(按键、鼠标等)时,我的应用程序将调用为该事件注册的委托函数 下面是实现。我试图使“invoke”函数(())成为可变模板,以便可以向其传递任何参数。但是,我目前的设置低于它是不可能的 在这个设计中如何使用可变模板 编辑更改的代码 template <typename... params> class EventDelegate { public: typedef std::function<int(params...)> EDelegate;

当事件触发(按键、鼠标等)时,我的应用程序将调用为该事件注册的委托函数

下面是实现。我试图使“invoke”函数(
()
)成为可变模板,以便可以向其传递任何参数。但是,我目前的设置低于它是不可能的

在这个设计中如何使用可变模板

编辑更改的代码

template <typename... params>
class EventDelegate
{
public:
    typedef std::function<int(params...)> EDelegate;

    EventDelegate(EDelegate delegate) : delegate(delegate)
    {

    }

    int operator()(params...) const
    {
        return delegate(params...);
    }

private:
    EDelegate delegate;
};

// Not valid because template params are not specified. But each EventDelegate can take different params
std::unordered_multimap<int, EventDelegate> evtRegistry; 

// Example

class Foo
{
public:
    int onLeftClick(GUID sender, Point pos);
    int onKeyDown(char key);
};

// Usage 

... 

evtRegistry[1] = EventDelegate(std::bind(&Foo::onLeftClick, myFoo, std::placeholders::_1, std::placeholders::_2));
evtRegistry[2] = EventDelegate(std::bind(&Foo::onKeyDown, myFoo, std::placeholders::_1));

我的第一个倾向,也许是这里最简单的答案,是为每种事件类型创建单独的数据结构。例如:

std::vector< EventDelegate< GUID, Point > > clickRegistry
std::vector< EventDelegate< char > > keyDownRegistry
虽然还不清楚当您可以直接使用
std::function
时,为什么要在这里创建一个单独的委托。(我可以看到在将来向委托类添加一些其他实用程序,也许这就是您的意图)


使用包含所有已注册事件的单一数据结构,您试图实现什么目标?

我的第一个倾向是,这里最简单的答案可能是为每个事件类型创建单独的数据结构。例如:

std::vector< EventDelegate< GUID, Point > > clickRegistry
std::vector< EventDelegate< char > > keyDownRegistry
虽然还不清楚当您可以直接使用
std::function
时,为什么要在这里创建一个单独的委托。(我可以看到在将来向委托类添加一些其他实用程序,也许这就是您的意图)


使用包含所有已注册事件的单一数据结构,您试图实现什么目标?

不清楚在不知道要传递哪个参数的情况下如何调用
EventDelegate
。@Jarod42 woops这是一个输入错误。我现在就修。这是我以前的实现它不清楚在遍历evtRegistry中的元素时如何区分事件。您如何在不知道模板实例的情况下调用函数?您希望如何使用
evtRegistry[x]
?@Jarod42请参阅编辑以获得事件处理。注意evtRegistry是一个
unordered_multimap
不清楚如何调用
EventDelegate
,而不知道要传递哪个参数…@Jarod42 woops这是一个输入错误。我现在就修。这是我以前的实现它不清楚在遍历evtRegistry中的元素时如何区分事件。您如何在不知道模板实例的情况下调用函数?您希望如何使用
evtRegistry[x]
?@Jarod42请参阅编辑以获得事件处理。注:evtRegistry是一个
无序的\u multimap
“用一个包含所有注册事件的单一数据结构,您想要实现什么?”,这是每个程序员想要实现的;简单、优雅和完美,duh“你想用一个包含所有注册事件的单一数据结构实现什么?”,这是每个程序员想要实现的;简单、优雅、完美,duh
clickRegistry.push_back( EventDelegate(std::bind(&Foo::onLeftClick, myFoo, std::placeholders::_1, std::placeholders::_2)) );