我正在研究事件管理器,其中事件由字符串和整数中的键表示。这意味着事件不由类或对象表示。这样,组件可以通过事件进行交流,但保持独立。对于活动经理来说,这是一个重要的指南,即事件不需要注册,但每个人都可以听或解雇它们。
(事件密钥的整数部分是为了将内容的阶段分组相同的事件。,..."手榴弹" 4。)
可选的事件可以包含一个空隙指针,以发送引用事件的数据。那可能是撞车事故的速度,即被杀的球员的身份证。
每个组件都包含一个指向事件名称Event
的指针。我想让他们注册方法或委托给事件。
// ideally registering for an event would look like that
Event.Listen("eventname", 0, this->Method);
Event.Listen("eventname", 0, [](){ ... });
// receiving data is optional
Event.Listen("eventname", 0, [](void* Data){ ... });
发射事件理想情况下可以类似。
Event.Fire("eventname", 0);
Event.Fire("eventname", 0, Data);
// fires events "eventname" 0, "eventname" 1, ... "eventname" 5
Event.FireRange("eventname", 0, 5);
活动经理保留了事件列表。这意味着事件密钥和所有注册功能的向量。
typedef unordered_map<pair<string, int>, vector<function>> ListEvent;
ListEvent List;
向量存储注册到特定事件的所有功能。我尝试使用功能指针,成员功能指针和std::function
s。但是没有什么能按照我想要的方式奏效。这是我与此事件管理器有关的一些问题:检查两个std ::函数是否相等,将功能指针存储到任何成员函数,检查对象的类型是否从特定类中继承。
对于听力功能,可以访问其类的成员。我想在一行代码中注册lambda函数。
您是否有任何想法或技术来接近编码此类事件经理?
我试图以一般的方式提出我的问题,但是如果您需要其他说明或代码,请随时发表评论。
这是快速工作的草图:
#include <vector>
#include <functional>
#include <iostream>
typedef std::function<void(int param)> callback;
struct Event {
std::vector<callback> subs;//criptions
void subscribe(callback cb) { subs.push_back(cb); }
void fire(int param = 0) { for(callback& cb : subs) cb(param); }
};
void some_free_func(int param) { std::cout << "some_free_func got signal" << std::endl; }
int main(int argc, char* argv[])
{
Event evt0;
evt0.subscribe(some_free_func);
evt0.subscribe([](int p) { std::cout << "some_lambda got signal" << std::endl; } );
evt0.fire();
return 0;
}
从概念上讲,它粗略地完成了您的需求,但您应该在这里考虑所有权政策。检查上面的问题。
编辑:如果您说所有权不是问题,那么这可能有效:
void my_object::firstCry() {
evt0.subscribe([=](int p) { this->got_signal(p); }); // inst/method thunk
}
void my_object::got_signal(int param) {...}