值得一看
广告
彩虹云商城
广告

热门广告位

c++怎么实现一个简单的发布/订阅系统_c++发布订阅(Pub/Sub)模式实现方法

答案:使用观察者模式和std::function实现事件总线,通过map管理主题与回调,支持订阅/发布,示例含日志与告警响应,可扩展线程安全与模板化。

c++怎么实现一个简单的发布/订阅系统_c++发布订阅(pub/sub)模式实现方法

在C++中实现一个简单的发布/订阅(Pub/Sub)系统,核心是让消息的发送者(发布者)与接收者(订阅者)解耦。订阅者可以注册自己感兴趣的事件或主题,当某个主题有消息发布时,所有订阅该主题的观察者都会收到通知。

基本设计思路

使用观察者模式结合回调机制来实现。关键组件包括:

  • EventBus(事件总线):管理主题和订阅者的映射关系,负责消息分发。
  • Topic(主题):用字符串标识不同的消息通道。
  • Callback:订阅者提供的处理函数,用于响应消息。
  • Subscribe / Publish 接口:供外部调用的注册和发送方法。

使用std::function和std::map实现

下面是一个轻量级实现示例:

#include <iostream>
#include <map>
#include <vector>
#include <functional>
#include <string>
class EventBus {
public:
using Callback = std::function<void(const std::string&)>;
// 订阅某个主题
void subscribe(const std::string& topic, const Callback& callback) {
callbacks_[topic].push_back(callback);
}
// 发布消息到指定主题
void publish(const std::string& topic, const std::string& message) {
auto it = callbacks_.find(topic);
if (it != callbacks_.end()) {
for (const auto& cb : it->second) {
cb(message);
}
}
}
private:
std::map<std::string, std::vector<Callback>> callbacks_;
};

使用示例

定义几个简单的回调函数模拟不同订阅者:

立即学习“C++免费学习笔记(深入)”;

小绿鲸英文文献阅读器

小绿鲸英文文献阅读器

英文文献阅读器,专注提高SCI阅读效率

小绿鲸英文文献阅读器40

查看详情
小绿鲸英文文献阅读器

void logger(const std::string& msg) {
std::cout << "[Logger] Received: " << msg << "\n";
}
void alert_system(const std::string& msg) {
std::cout << "[Alert] !! " << msg << " !!" << "\n";
}
int main() {
EventBus bus;
// 订阅主题
bus.subscribe("logs", logger);
bus.subscribe("alerts", alert_system);
bus.subscribe("alerts", [](const std::string& msg) {
std::cout << "[Popup] " << msg << "\n";
});
// 发布消息
bus.publish("logs", "System started");
bus.publish("alerts", "High CPU usage!");
return 0;
}

输出结果:


[Logger] Received: System started
[Alert] !! High CPU usage! !!
[Popup] High CPU usage!

扩展建议

这个基础版本可以按需增强:

  • 支持取消订阅(unsubscribe),通过返回订阅ID或使用weak_ptr管理生命周期。
  • 使用线程安全队列和互斥锁,支持多线程发布/订阅。
  • 模板化消息类型,不只是string,可支持任意数据结构。
  • 引入引用计数或智能指针避免悬挂回调。

基本上就这些。不复杂但容易忽略的是回调生命周期管理——确保订阅者在被调用时仍然有效。简单场景下,手动控制对象生命周期即可。

相关标签:

回调函数 ai c++ ios stream String 回调函数 字符串 指针 数据结构 接口 线程 多线程 map function 对象 事件 alert

大家都在看:

HTML数据怎样进行数据评估 HTML数据价值评估的模型方法
WPS怎么设置页面边距_WPS页面边距调整与打印区域设置方法
解开轮回迷局,打破命定之死《龙女花》今日正式发售像素解谜AVG《龙女花》正式发售
html5文件如何管理上传队列状态 html5文件多任务上传的调度管理
Outlook邮箱数据备份方法_安全恢复Outlook邮箱的技巧
温馨提示: 本文最后更新于2025-10-21 16:31:44,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞8赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容