数组是不错的,不过MAP+函数对象应该也不错的~ std::map< message_type, function > 或者 std::map< message_type, signal >。
如果为了效率,也可以用 std::vector< message_type, function > 并且需要注意空间分配,message_type太多的话需要重新resize()哦~另外没有注册的消息建议也给一个 void(){}的处理函数,避免每个消息的if判断(push和pop操作比 mov, jne稍微快点,主要是不需要在缓存未命中的时候读取外存,个人观点,欢迎拍砖)
将消息类型定义成系统常量,包含在系统配置头文件里面,处理消息(发送或者接收)的类包含该文件,并在需要的时候注册。
系统初始化启动的时候,以及运行过程中,都可以通过注册及注销消息类型来达到动态管理的目的。
消息基础定义建议只有长度+后续包标志+校验(tcp协议可以连校验都去掉),所有的消息处理函数到底层都是一个个的数据包,由底层将数据包打包成 {长度,数据}的简单封装即可。
消息处理函数可以使用信号链,这样就可以让一个消息自动广播出去,所有感兴趣的对象都能得到该消息。
系统流程看起来应该如此:
对象 -> 对象编码 -> 数据块: {message_type, 数据} -> 传输编码 -> {长度,数据块} -> 传输解码 -> {message_type, 数据} -> 对象解码(此处可以产生消息广播)
--
签名是什么东西??