C++ 如何扩展此C++;11事件系统来处理多个参数?

C++ 如何扩展此C++;11事件系统来处理多个参数?,c++,c++11,event-handling,stl,C++,C++11,Event Handling,Stl,我利用std::function编写了一个简单的订户事件系统。它工作得很好!(稍后我还可以通过线程池对昂贵的回调进行一些大的增强) 改进这一点的下一步是使用多个参数处理事件/回调 除了强制structs/classes或在回调参数中使用std::tuples(我希望保持函数干净或使用现有的简单函数)。有没有一个好方法可以做到这一点,并且有多个模板参数都使用相同的代码 #pragma once #include <mutex> #include <vector> te

我利用
std::function
编写了一个简单的订户事件系统。它工作得很好!(稍后我还可以通过线程池对昂贵的回调进行一些大的增强)

改进这一点的下一步是使用多个参数处理事件/回调

除了强制
struct
s/
class
es或在回调参数中使用
std::tuple
s(我希望保持函数干净或使用现有的简单函数)。有没有一个好方法可以做到这一点,并且有多个模板参数都使用相同的代码

#pragma once

#include <mutex>
#include <vector>


template<typename PARAM>
class SoyEvent
{
public:
    typedef std::function<void(PARAM&)> FUNCTION;

public:
    //  helper for member functions
    template<class CLASS>
    void            AddListener(CLASS& This,void(CLASS::*Member)(PARAM&))
    {
        //  http://stackoverflow.com/a/7582576
        auto bound = std::bind( Member, &This, std::placeholders::_1  );
        AddListener( bound );
    }
    template<class CLASS>
    void            RemoveListener(CLASS& This,FUNCTION Member)
    {
        RemoveListener( std::bind( &Member, &This ) );
    }

    //  add static or lambda
    void            AddListener(FUNCTION Function)
    {
        std::lock_guard<std::mutex> lock(mListenerLock);
        mListeners.push_back(Function);
    }
    void            RemoveListener(FUNCTION Function)
    {
        std::lock_guard<std::mutex> lock(mListenerLock);
        mListeners.erase(Function);
    }

    void            OnTriggered(PARAM& Param)
    {
        std::lock_guard<std::mutex> lock(mListenerLock);

        //  todo: execute on seperate threads with a scheduler which can just execute std::functions
        for ( auto it=mListeners.begin();   it!=mListeners.end();   it++ )
        {
            auto& Function = *it;
            Function( Param );
        }
    }

private:
    std::mutex      mListenerLock;
    std::vector<FUNCTION>   mListeners;
};
#pragma一次
#包括
#包括
模板
班级活动
{
公众:
typedef std::函数;
公众:
//成员函数的助手
模板
void AddListener(类&此,void(类::*成员)(参数&))
{
//  http://stackoverflow.com/a/7582576
自动绑定=std::bind(成员,&This,std::占位符::_1);
AddListener(绑定);
}
模板
void RemoveListener(类和此,函数成员)
{
RemoveListener(std::bind(&Member,&This));
}
//添加静态或lambda
void AddListener(函数)
{
标准:锁和防护锁(mListenerLock);
mListeners.push_back(函数);
}
void RemoveListener(函数)
{
标准:锁和防护锁(mListenerLock);
mListeners.erase(函数);
}
无效未触发(参数和参数)
{
标准:锁和防护锁(mListenerLock);
//todo:使用调度程序在单独的线程上执行,该调度程序只能执行std::函数
对于(自动it=mListeners.begin();it!=mListeners.end();it++)
{
auto&Function=*it;
函数(Param);
}
}
私人:
std::互斥多址锁;
std::矢量多址侦听器;
};

为什么不使用可变模板,即从以下内容更改类定义:

template <typename PARAM>
class SoyEvent {
     // Implementation
};

一般来说,将
PARAM&
的所有实例更改为
PARAMS&…

,尽管这是一个很好的注释。对于一个没有经验的程序员来说,这里没有足够的细节来实际实现您的想法。此外,此站点用于查看现有代码,而不是设计增强功能。由于这个网站上的评论人数很少,如果更多的人能够回答这个问题,我们就不会指向一个流量更大的网站,这将是对OP a的伤害。
template <typename... PARAMS>
class SoyEvent {
     // Implementation
};
typedef std::function<void(PARAMS&...)> FUNCTION;