在地图中存储boost :: signals2信号?

时间:2012-06-04 15:15:48

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

  

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"
}

答案 2 :(得分:1)

因为它是不可复制的和不可移动的(可能在最新版本上有所改变)。对于std :: map,如果你不想使用shared_ptr,你可以使用operator []而不是insert或emplace方法,因为如果key_value不存在,operator []构造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