Boost::signals2 - 使用槽解析对象

2023-12-14

考虑一下:

#include <boost/signals2.hpp>
#include <iostream>

struct object_with_slot
{
void operator()()
{
   std::cout << "Slot called!" << std::endl;
   member = 50500;
}
int member;
};


int main()
{
boost::signals2::signal<void ()> sig;

object_with_slot * ptr = new object_with_slot;
sig.connect(*ptr);

delete ptr;

sig();
}

输出是“槽位已调用!”没有崩溃或任何事情。这就是为什么我有几个问题:

1)为什么没有崩溃?

2)为什么即使槽函数将一些东西分配给不存在的对象也不会崩溃?

3)如何让信号自动跟踪其插槽的寿命?我的意思是,当插槽被破坏时,它就会断开连接。

第三个问题是最重要的,因为我需要实现观察者模式,并且观察者(槽)的生命周期通常不会是静态的(在应用程序运行的整个过程中)。


1)你很幸运。如果没有,您将遇到分段错误。

2) 内存未被以任何方式覆盖。

3)您可以使用 slot::track 在跟踪对象被删除时自动断开连接。 Boost.Signals2 可以跟踪由 boost::shared_ptr 管理的对象。

#include <boost/signals2.hpp>
#include <boost/shared_ptr.hpp>

struct object_with_slot
{
    void operator()()
    {
       std::cout << "Slot called!" << std::endl;
       member = 50500;
    }
    int member;
};

//
int main()
{
    typedef boost::signals2::signal<void ()> sig_type;
    sig_type sig;

    {
        boost::shared_ptr<object_with_slot> ptr(new object_with_slot);
        sig.connect(sig_type::slot_type(*ptr).track(ptr));

        // 'object_with_slot' managed by ptr is destroyed
    }

    sig(); // 'object_with_slot' not called here.

    return 0;
}

UPDATE:
添加了跟踪 std::shared_ptr 和 std::weak_ptr 对象的代码:

#include <memory>
#include <boost/signals2.hpp>

// added specializations for std::weak_ptr and std::shared_ptr
namespace boost
{
  namespace signals2
  {
    template<typename T> struct weak_ptr_traits<std::weak_ptr<T> >
    {
      typedef std::shared_ptr<T> shared_type;
    };

    template<typename T> struct shared_ptr_traits<std::shared_ptr<T> >
    {
      typedef std::weak_ptr<T> weak_type;
    };
  }
}

struct object_with_slot
{
    void operator()()
    {
       std::cout << "Slot called!" << std::endl;
       member = 50500;
    }
    int member;
};

//
int main()
{
    typedef boost::signals2::signal<void ()> sig_type;
    sig_type sig;

    std::shared_ptr<object_with_slot> ptr(new object_with_slot);
    sig.connect(sig_type::slot_type(*ptr).track_foreign(ptr)); // ptr is tracked

    sig();

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

Boost::signals2 - 使用槽解析对象 的相关文章

随机推荐

  • 在 React 中管理多个音频源

    我有一个 React 组件 当您单击按钮时 它会播放 暂停音频 它效果很好 我一次在一个页面上渲染大约 5 个 但是 如果您单击一个音频的 播放 然后单击另一个音频的 播放 则两个音频都会播放 这不太好 这是我的组件代码 import Re
  • 在 R Markdown 中格式化表格以导出到 MS Word 文档

    我已经开始使用expss在 R Markdown 中 在 Knitr 的帮助下生成表格 我想自动生成需要以 Microsoft Word 格式准备的报告的表格和分析 当编织到 HTML 时 表格看起来很棒 Word 中的表格显示为纯文本行
  • 三元结构不等同于 if then else

    以下 if then 测试 在 bash 中 if 1 then ls undef dummy gt dev null 2 gt 1 else echo else stmt fi 似乎不等于它的三元版本 test 1 ls undef du
  • 停止秒表

    我在 JPanel 类中有以下代码 该代码被添加到另一个类 JFrame 中 我想要实现的是某种秒表程序 startBtn addActionListener new startListener class startListener im
  • 按区域调整图像大小

    我正在尝试编写一个javascript函数来根据给定区域 或者在我的情况下 有点不准确 平均尺寸 调整图像大小 因为这更容易思考 我想要的不是输入最大高度和宽度 而是以最大面积进给 以便长或窄的图像在视觉上看起来大小大致相同 不过 我真的很
  • 如何在 Javascript 中使用 PHP 变量?

    我知道你不能直接在 javascript 代码中使用 PHP 变量 但是有办法解决吗 我需要在 javascript 中使用这些参数 username example co uk password example 它不显示 user id
  • 如何使用 ARM 模板创建标准类型逻辑应用

    我可以使用 ARM 模板通过示例工作流程创建消费类型逻辑应用程序 我想使用 ARM 模板创建带有示例工作流程的标准类型逻辑应用程序 但是 我找不到上述文档的任何参考文档 那么 任何人都可以帮我解决这个问题吗 抱歉 在我之前的回答中 我误解了
  • 如何在空手道 UI 驱动程序中处理 SSL 证书?

    When I open my resource I am faced with notification Your connection is not private Is there a way to disable the verifi
  • 从其他表中选择一个值时插入

    我想insert新值放入表中where其中一个值是从带有条件的另一个表中选择的 另一个值是常量 硬编码 该命令给出语法错误 INSERT INTO table1 itemId reservedId VALUES SELECT id FROM
  • iPhone - CLHeading 寻找方向

    在我的 iPhone 应用程序中 我使用 CLLocationManager 来查找我的 iPhone 指向的方向 我正在使用 标题 属性 它给了我 x y 和 z 值 如何从这些值中找到我当前指向的方向 北或南或东或西 你应该使用方法 l
  • 自定义查询分页 Cakephp

    我的控制器中有一个自定义查询 我想实现在 cakephp org 上找到的自定义查询分页 但他们的示例与我的示例不相似 有人可以帮我根据我的观点对这个结果进行分页吗 cars this gt Car gt query select Car
  • Java:类.this

    我有一个看起来像这样的 Java 程序 public class LocalScreen public void onMake aFuncCall LocalScreen this oneString twoString 什么是LocalS
  • PHP 会话启动“无法发送会话 cookie 和缓存限制器”

    我已将我的托管服务器从 Windows 系统更改为 Linux 系统 但是当我运行 PHP 程序时 出现以下错误 Warning session start function session start Cannot send sessio
  • 添加 firebase-ui-auth:2.3.0 依赖项时出错

    我从昨天开始就面临这个问题 我添加 Add Library compile com android support design 26 1 0 compile com firebaseui firebase ui 0 2 0 compile
  • 使用异步任务在 gridview 中加载图像,未正确加载

    我正在尝试在 gridview 异步中加载缩略图 因为其他方式显示时间太长 当我以正常方式进行操作时 它可以很好地显示图像 代码和图像 Utils public static Bitmap getThumbnail Context cont
  • ValueError:未知的 MS 编译器版本 1900

    我正在尝试使用 cygwin mingw 在 Windows 10 上使用 Python 3 5 运行一些代码 准确地说 我使用的是 PyDSTool 模块 我将其称为 dopri 积分器 问题是 我遇到了麻烦distutils无法识别 M
  • 在 WooCommerce 中列出带有订单详细信息的优惠券

    我有一个有 1000 张优惠券的网站 所有优惠券的使用限额均为一张 我使用 Raunuk Gupta 提供的代码直接从 SQL 数据库导出优惠券 WooCommerce 优惠券如何存储在数据库中 是否可以检索使用优惠券的用户的订单元 我想在
  • 查询 Parquet 记录中的嵌套数组

    我正在尝试不同的方法来查询记录数组中的记录并将完整的行显示为输出 我不知道哪个嵌套对象有字符串 pg 但我想查询特定对象 对象是否有 pg 如果 pg 存在 那么我想显示完整的行 如何在嵌套对象上编写 spark sql查询 而不指定对象索
  • Swift 中的不可变/可变集合

    我指的是 Apple 的 Swift 编程指南 以了解用 Swift 语言创建可变 不可变对象 数组 字典 集合 数据 但我无法理解如何在 Swift 中创建不可变集合 我希望看到 Swift 中 Objective C 中的等价物 不可变
  • Boost::signals2 - 使用槽解析对象

    考虑一下 include