【问题标题】:Storing a boost::signals2 signal in a map?在地图中存储 boost::signals2 信号?
【发布时间】:2012-06-04 15:15:47
【问题描述】:

我面临以下问题:我想在地图中存储多个boost::signals2 信号变量。由于这些信号是不可复制的,这显然是行不通的。我该如何解决这个问题?我已经找到this older question。在其中,一张海报建议将信号存储为shared_ptr。这是唯一的方法吗?它有什么缺点,或者更重要的是,它是否安全

【问题讨论】:

  • 您也可以存储boost::signals2::signal *,但shared_ptr 只是一种方便的方式,无需担心删除对象。 安全是什么意思?
  • @wroniasty 我只是想知道 boost::signals2 是否打算以这种方式使用。我不想介绍依赖于无证行为的代码。
  • 好吧,一个不能安全存储在shared_ptr中的类坏了。

标签: c++ signals-slots boost-signals2


【解决方案1】:

正如一些评论员所指出的:将shared_ptrs 用于信号是非常安全的。我的实现工作正常并且在此期间已经过彻底测试,我很高兴地报告确实没有问题:)

【讨论】:

    【解决方案2】:

    如果不打算共享信号,您可以将分配在堆上的 boost::signal 对象存储在 Boost Pointer Container 内:

    Boost.Pointer Container 提供了用于存放堆分配的容器 以异常安全的方式和最小开销的对象。

    boost 指针容器存储指向其元素的指针,并在必要时自动删除这些堆对象。 API 试图隐藏元素由指针存储的事实,并尽可能返回元素引用。

    例子:

    #include <iostream>
    #include <map>
    #include <string>
    #include <boost/ptr_container/ptr_map.hpp>
    #include <boost/signals.hpp>
    
    void foo() {std::cout << "foo\n";}
    
    void bar() {std::cout << "bar\n";}
    
    int main()
    {
        typedef boost::signal<void ()> Signal;
        boost::ptr_map< std::string, Signal> sigmap;
        sigmap["foo"].connect(&foo);
        sigmap["bar"].connect(&bar);
        sigmap["foo"](); // emit signal associated with "foo"
        sigmap["bar"](); // emit signal associated with "bar"
    }
    

    【讨论】:

      【解决方案3】:

      由于它不可复制且不可移动(可能在最新版本中已更改)。对于 std::map 如果您不想使用 shared_ptr ,则可以使用 operator[] 而不是 insert 或 emplace 方法,因为 operator[] 如果 key_value 不存在则构造 mapped_type 。显然,当您要使用先前分配的插槽添加信号时,它不能解决问题。

      typedef boost::signal2... Signal;
      std::map<int, Signal> sigmap;
      sigmap[1]; // constructs signal using default constructor
      sigmap[2].connect(slot); // constructs signal and connects slot
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-11
        • 2011-12-18
        • 2014-04-08
        • 2012-02-22
        相关资源
        最近更新 更多