1

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

4

3 回答 3

2

正如一些评论员所指出的:使用shared_ptrsfor 信号是非常安全的。我的实现工作有效,同时经过了彻底的测试,我很高兴地报告确实没有问题:)

于 2012-09-04T08:08:04.587 回答
2

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

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

升压指针容器存储指向其元素的指针,并在必要时自动删除这些堆对象。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"
}
于 2013-03-06T05:45:32.200 回答
1

由于它不可复制且不可移动(可能在最新版本中已更改)。对于 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
于 2014-12-09T08:01:32.683 回答