我开发了一个基于 void 指针的事件系统,它现在可以工作了。它使用模板来传递和接收数据。支持没有参数或任何类型的一个参数的函数。由于它使用 void 指针来存储回调函数,我认为与使用 boost 框架中的 any 类型的解决方案相比,它非常快。
#include <string>
#include <vector>
#include <unordered_map>
#include <functional>
#include <memory>
using namespace std;
class ManagerEvent
{
typedef unordered_map<string, unordered_map<int, vector<pair<void*, bool> > > > Events;
public:
void Listen(string Name, function<void()> Function)
{
Listen(Name, 0, Function);
}
void Listen(string Name, int State, function<void()> Function)
{
List[Name][State].push_back(make_pair(new function<void()>(Function), false));
}
template <typename T>
void Listen(string Name, function<void(T)> Function)
{
Listen<T>(Name, 0, Function);
}
template <typename T>
void Listen(string Name, int State, function<void(T)> Function)
{
List[Name][State].push_back(make_pair(new function<void(T)>(Function), true));
}
void Fire(string Name)
{
Fire(Name, 0);
}
void Fire(string Name, int State)
{
auto Functions = List[Name][State];
for (auto i = Functions.begin(); i != Functions.end(); ++i)
{
if(i->second) continue;
else (*(function<void()>*)(i->first))();
}
}
void FireRange(string Name, int From, int To)
{
for(int i = From; i <= To; ++i) Fire(Name, i);
}
template <typename T>
void Fire(string Name, T Data)
{
Fire(Name, 0, Data);
}
template <typename T>
void Fire(string Name, int State, T Data)
{
auto Functions = List[Name][State];
for (auto i = Functions.begin(); i != Functions.end(); ++i)
{
if(i->second) (*(function<void(T)>*)i->first)(Data);
else (*(function<void()>*)i->first)();
}
}
private:
Events List;
};
这就是我想到的,而且效果很好。但是,请随时提出改进建议或将代码用于您自己的项目。