使用boost::bind中的boost信号

5
我希望您能将boost :: signal的触发包装到boost :: bind对象中。所以我想要的是在调用boost :: function时使用一些预打包的参数来调用信号。
我的代码如下:
boost::signals2::signal<void(int)> sig;
boost::function<void()> f = boost::bind(
    &(sig.operator()), &sig, 10);

但是这种方式不起作用。我得到了以下错误: 错误:未找到与bind(,...)匹配的函数
我也尝试了这个:
boost::function<void()> f = boost::bind(
    (void(boost::signals2::signal<void(int)>::*)(int))
    &(sig.operator()), &sig, 10);

但是我得到了“没有上下文类型信息的重载函数地址”。

那么这个的正确语法是什么?

1个回答

13

boost::signals2::signal的实例是一个函数对象(又称为functor),可以直接绑定,详情请参见这里。唯一的问题在于信号(signal)是不可复制(noncopyable)的,因此它无法复制到bind返回的对象中。因此,您需要首先使用boost::ref将其包装起来。下面是一个示例:

#include <boost/signals2.hpp>
#include <boost/bind.hpp>
#include <boost/ref.hpp>

int main(void)
{
  boost::signals2::signal<void(int)> sig;
  boost::function<void()> f = boost::bind(boost::ref(sig), 10);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接