我正在尝试将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);
但是后来我得到了“没有上下文类型信息的重载函数的地址。”
那么这是什么样的语法?
答案 0 :(得分:9)
boost :: signals2 :: signal的一个实例是一个函数对象(a.k.a. functor),可以直接绑定,如here所述。在这种情况下唯一的问题是信号是不可复制的,因此它不能被复制到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);
}