C++11 观察者模式(信号、槽、事件、更改广播器/侦听器或任何您想要的名称)

2023-12-24

随着 C++11 中所做的更改(例如包含std::bind),是否有推荐的方法来实现简单的单线程观察者模式,而不依赖于核心语言或标准库外部的任何内容(例如boost::signal)?

EDIT

如果有人可以发布一些代码来显示如何依赖boost::signal可以使用新的语言功能来减少,这仍然非常有用。


我觉得bind做到了easier创建插槽(参见“首选”语法与“可移植”语法 http://www.boost.org/doc/libs/1_52_0/doc/html/signals/tutorial.html#id3284837- 这一切都会消失)。然而,观察员管理并没有变得不那么复杂。

但作为@R.马蒂尼奥·费尔南德斯提到:std::vector<std::function< r(a1) > >现在可以轻松创建,无需(人工)“纯虚拟”接口类的麻烦。


根据要求:关于连接管理的想法 - 可能充满错误,但你会明白的:

// note that the Func parameter is something
// like std::function< void(int,int) > or whatever, greatly simplified
// by the C++11 standard
template<typename Func>
struct signal {
  typedef int Key; // 
  Key nextKey;
  std::map<Key,Func> connections;

  // note that connection management is the same in C++03 or C++11
  // (until a better idea arises)
  template<typename FuncLike>
  Key connect( FuncLike f ) {
     Key k=nextKey++;
     connections[k]=f;
     return k;
  }

  void disconnect(Key k){
     connections.erase(k);
  }

  // note: variadic template syntax to be reviewed 
  // (not the main focus of this post)
  template<typename Args...>
  typename Func::return_value call(Args... args){
     // supposing no subcription changes within call:
     for(auto &connection: connections){
        (*connection.second)(std::forward(...args));
     }
  }
};

Usage:

signal<function<void(int,int)>> xychanged;

void dump(int x, int y) { cout << x << ", " << y << endl; }

struct XY { int x, y; } xy;

auto dumpkey=xychanged.connect(dump);
auto lambdakey=xychanged.connect([&xy](int x, int y){ xy.x=x; xy.y=y; });

xychanged.call(1,2);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11 观察者模式(信号、槽、事件、更改广播器/侦听器或任何您想要的名称) 的相关文章

随机推荐

  • 带有遮罩层的 UIVisualEffectView

    我试图模糊 MKMapView 同时在其上方显示圆形蒙版 为了更好地形象化我的意思 你可以找到我当前状态的图片 这几乎显示了我想要的内容 但背景 地图 应该是模糊的 而这张图片中的情况并非如此 我尝试使用 UIVisualEffectVie
  • 为什么Subject.Dispose不处理当前订阅?

    嗨 我已经想了一段时间了Subject
  • 统计图像数量并比较相似度

    我正在编写一个名为 Memory 的游戏 其中包含随机顺序的 8 对图像 16 个图像 游戏开始时 16个必须显示相同的背景图像 玩家单击任何图块后 图块会从背景图像翻转为前景图像 如果两个前景图像相同 它们就会保留 如果两个前景图像不同
  • java中的try-catch-finally块

    根据我的理解 我想遵循最后释放资源的最佳实践 以防止任何连接泄漏 这是我在 HelperClass 中的代码 public static DynamoDB getDynamoDBConnection try dynamoDB new Dyn
  • Java:递归打印钻石

    如何使用 Java 在给定尺寸的情况下递归打印钻石 大小为 5 会产生 到目前为止我拥有的代码 public static void dia int statSize int size int count int statSizeLarge
  • x86 程序集:弹出一个值而不存储它

    在x86汇编中 是否可以从堆栈中删除一个值而不存储它 类似的东西pop word null 我显然可以使用add esp 4 但也许我缺少一个漂亮干净的 cisc 助记符 add esp 4 add rsp 8 is正常 惯用 干净的方式
  • Compact Framework 的 Zip 库选项?

    我的要求 支持 NET Compact Framework 2 0 和Windows Mobile 6 0 设备 只需将内容解压到存储卡上的目录即可 不需要创建 zip 文件 必须能够在企业 商业软件中使用 可以开源 但没有 GPL 或其他
  • 动态删除一系列 Excel 单元格中的空白

    我有一个命名的数据范围 称为 数据 我试图找到一个公式或数组公式 它将返回新的单元格范围中的数据 但会丢失所有空白行 i e data is row x y 1 A 77 2 3 B 23 4 A 100 5 我的新范围是 row x y
  • Android 中没有提示的蓝牙发现

    我可以使用以下代码在没有任何提示的情况下打开 关闭蓝牙 这个需要BLUETOOTH and BLUETOOTH ADMIN权限 boolean isEnabled bluetoothAdapter isEnabled if enable i
  • 即使我安装了它,也没有名为“Kivy”的模块

    据我所知 我已经安装了 Kivy 和所有需要的文件 但我仍然收到此错误消息 我不知道为什么 from kivy app import App from kivy uix gridlayout import GridLayout class
  • 四色定理美国地​​图的Java实现

    我试图为每个状态分配一种颜色 以便没有两个相邻的状态共享相同的颜色 http en wikipedia org wiki Four color theorem http en wikipedia org wiki Four color th
  • 如何将 ICC 添加到现有 PDF 文档

    我有一个使用 CMYK 颜色的现有 PDF 文档 它是使用我获得的特定 ICC 配置文件创建的 如果我在配置文件处于活动状态时打开文档 则颜色明显不同 据我使用各种工具所知 文档中没有嵌入 ICC 配置文件 我想做的是将 ICC 配置文件嵌
  • 加密/解密大文件 (.NET)

    我必须加密 存储然后解密大文件 最好的方法是什么 我听说 RSA 加密很昂贵 建议使用 RSA 加密 AES 密钥 然后使用 AES 密钥加密大文件 任何带有示例的建议都会很棒 一种有机体很大 另一种有机体很小 尽管我们看到它时都知道它很昂
  • MySQL 中复杂的 COUNT 查询

    我正在尝试查找特定用户拥有的视频积分数量 以下是相关的三个表 CREATE TABLE userprofile userprofile id int 11 NOT NULL AUTO INCREMENT full name varchar
  • pandas 绘图值以降序计数 barplot [重复]

    这个问题在这里已经有答案了 我有一个数据框 我试图计算每个值的出现次数 我将其绘制为水平条 但无法对其进行排序 df pd DataFrame A A A B B C columns letters df value counts A 3
  • 当某些后台进程仍在运行时,命令“exit”不起作用

    退出 命令不适用于我的情况 我不明白为什么 ssh user mysever lt lt HEREDOC echo 1 Running PM2 log pm2 log echo 2 PM2 log is now in background
  • 如何在applozic中列出我的联系人列表并发送消息

    Context context getApplicationContext AppContactService appContactService new AppContactService context if appContactSer
  • 尽管实际和预期相同,但 JUnit 给出 ComparisonFailure

    我正在尝试使用 Jsoup 解析网站中的字符串 并编写以下测试来验证解析 这是我的测试 Test public void extractBookData throws Exception String bookLink some addre
  • 将“$(VAR)”回显到文件

    我的 Makefile 中的一行遇到以下问题 echo include BASE Makefile base gt file 如果我直接将其写入控制台 它实际上会将 include BASE Makefile base 打印到文件中 但是当
  • C++11 观察者模式(信号、槽、事件、更改广播器/侦听器或任何您想要的名称)

    随着 C 11 中所做的更改 例如包含std bind 是否有推荐的方法来实现简单的单线程观察者模式 而不依赖于核心语言或标准库外部的任何内容 例如boost signal EDIT 如果有人可以发布一些代码来显示如何依赖boost sig