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