我利用 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;
};
最佳答案
为什么不只使用可变参数模板,即更改类定义:
template <typename PARAM>
class SoyEvent {
// Implementation
};
类似于:
template <typename... PARAMS>
class SoyEvent {
// Implementation
};
然后将您的 FUNCTION
typedef 更改为:
typedef std::function<void(PARAMS&...)> FUNCTION;
一般来说,将 PARAM&
的所有实例更改为 PARAMS&...
。
关于c++ - 如何扩展这个 C++11 事件系统来处理多个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24725049/