本发明涉及软件技术领域,具体涉及c++事件总线实现方法。
背景技术
对于软件模块之间的功能调用,传统的方式是通过直接调用软件模块里面的接口来实现的;这种方法的优点是调用者和被调用者明确,但是缺点也是非常明显的,模块之间具有很高的耦合度,使得软件在开发以及后期维护、扩展上非常不利。
通过事件总线调用模块的方式很好的避免传统模块调用存在的问题。
目前在c++里面实现事件总线的方法普遍是预先规定消费者接收事件的参数的数量和类型,由此需要预先规定所有事件的参数的数量和类型,从而导致不能做到运行时检测,灵活度很低。这也是目前事件总线在c++的应用率没有其他语言高的原因之一。
因此,提高c++事件总线的灵活度(不限制事件的生产者和消费者的编写格式以及支持运行时的检测)是很有必要的。
技术实现要素:
本发明的目的在于提供更具灵活性以及易用性的c++事件总线实现方法。
为此,本发明采用以下方案:
c++事件总线实现方法,包括以下步骤:
创建获取消费者所能处理事件的类型的模板结构体;
通过所述模板结构体获取消费者所能处理的事件的类型;
建立消费者及其所能处理的事件的类型的映射关系,将所述映射关系保存为映射表;
将所述映射表保存在事件总线中;
将第一事件发送至事件总线;
根据所述第一事件的类型在映射表中匹配能处理的所述第一事件的类型的消费者;
将第一事件发送至所匹配到的消费者。
本发明提供的c++事件总线实现方法具有很高的灵活性、易用性,具体表现如下:
1.不限制事件的类型;
2.支持生产者产生的事件的数量和类型在运行时和消费者进行匹配;
3.支持运行时检测。
附图说明
图1为本发明实施例提供的c++事件总线实现方法的流程图。
图2为本发明实施例提供的c++事件总线实现方法的一个具体应用案例的c++代码运行结果截图。
具体实施方式
以下结合附图及具体实施例对本发明作进一步说明。
参照图1。本实施例提供的c++事件总线实现方法,包括以下步骤:
a.创建获取消费者所能处理事件的类型的模板结构体;
b.通过所述模板结构体获取消费者所能处理的事件的类型;
c.建立消费者及其所能处理的事件的类型的映射关系,将所述映射关系保存为映射表;
d.将所述映射表保存在事件总线中;
e.将第一事件发送至事件总线;
f.根据所述第一事件的类型在映射表中匹配能处理的所述第一事件的类型的消费者;
g.将所述第一事件发送至所匹配到的消费者。
以下对本实施例提供的c++事件总线实现方的各个步骤作详细说明。
所述a.创建获取消费者所能处理事件的类型的模板结构体的具体方法为:
a1.先声明一个基本的第一模板结构体;
a2.再声明与消费者所能处理的事件的类型相匹配的第二模板结构体。
因为要实现生产者产生的事件的类型在运行时和消费者进行匹配,因此必须能够在运行时获取到消费者所能处理的事件的类型的信息。在其他语言里面可以通过反射的机制进行获取,但c++没有反射的机制,本实施例中通过模板结构体的方法实现类似反射的机制。
b.通过所述模板结构体获取消费者所能处理的事件的类型的具体方法为:
b1.通过所述第一模板结构体以及所述第二模板结构体获取消费者所能处理事件的类型。
以消费者所能处理的事件的参数的数量为n的c++的代码举例如下:
上述代码说明如下:
ret表示消费者的返回类型;
param1,param2,….paramn表示消费者的参数;
typedefret(*funcpointer)(param1,param2,…,paramn)表示事件的类型;
通过functiontraits<t>获取消费者所能处理事件的类型时,编译器会自动寻找一个符合该消费者所能处理的事件的参数的数量的模板结构体进行实例化,因此调用functiontraits<t>::funcpointer之后即可获取消费者所能处理的事件的类型。
c.建立消费者及其所能处理的事件的类型的映射关系,将所述映射关系保存为映射表;
d.将所述映射表保存在事件总线中;
根据所获取到的消费者所能处理的事件的类型,通过typeid函数将消费者所能处理的事件的类型提取为运行时可使用的信息;
typeid(functiontraits<t>::funcpointer)。
根据typeid函数提取的信息,建立消费者及其所能处理的事件的类型的映射关系,并将该映射关系保存在事件总线类型为std::map<type_index,void*>的映射表中:
subscribermap[typeid(functiontraits<t>::funcpointer)]
=functiontraits<t>::funcpointer(t);
e.将第一事件发送至事件总线;
f.根据所述第一事件的类型在映射表中匹配能处理的所述第一事件的类型的消费者;
g.将所述第一事件发送至所匹配到的消费者。
事件总线通过使用typedef的方法,将生产者产生的事件的类型组合起来后,通过typeid获取该事件类型的运行时参数,然后在映射表里面,匹配对应的消费者。
本实施例提供的c++事件总线实现方法具有很高的灵活性、易用性,具体表现如下:
1.不限制事件的类型;
2.支持生产者产生的事件的数量和类型在运行时和消费者进行匹配;
3.支持运行时检测。
此外,对于本实施例提供的c++事件总线实现方法中,各步骤的执行单位作如下说明:
创建获取消费者所能处理事件的类型的模板结构体;该步骤由事件总线编写人员编写;
通过所述模板结构体获取消费者所能处理的事件的类型;该步骤由事件总线执行;
建立消费者及其所能处理的事件的类型的映射关系,将所述映射关系保存为映射表;该步骤由事件总线执行;
将所述映射表保存在事件总线中;该步骤由事件总线执行;
将第一事件发送至事件总线;该步骤由事件生产者执行;
根据所述第一事件的类型在映射表中匹配能处理的所述第一事件的类型的消费者;该步骤由事件总线执行;
将第一事件发送至所匹配到的消费者;该步骤由事件总线执行。
由上,可知:
先声明一个基本的第一模板结构体;再声明与消费者所能处理的事件的类型相匹配的第二模板结构体;该两个步骤由事件总线编写人员编写。
通过所述第一模板结构体以及所述第二模板结构体获取消费者所能处理事件的类型;该步骤由事件总线执行。
根据所获取到的消费者所能处理的事件的类型,通过typeid函数将消费者所能处理的事件的类型提取为运行时可使用的信息;根据typeid函数提取的信息,建立消费者及其所能处理的事件的类型的映射关系,并将该映射关系保存在事件总线类型的映射表中;该两个步骤由事件总线执行。
采用本实施例提供的c++事件总线实现方法的一个具体应用案例的c++代码如下:
本实施例提供的c++事件总线实现方法的一个具体应用案例的c++代码运行结果截图如图2所示。
以上为本发明举例说明。