Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何传递信号回调(使用boost::bind)_C++_Boost_Boost Bind_Boost Signals_Boost Signals2 - Fatal编程技术网

C++ 如何传递信号回调(使用boost::bind)

C++ 如何传递信号回调(使用boost::bind),c++,boost,boost-bind,boost-signals,boost-signals2,C++,Boost,Boost Bind,Boost Signals,Boost Signals2,我正在为boost::signals2::signal编写一个包装器,以获得一个更干净、更易于使用的界面。以下是我的想法: #包括 //boost::signals2::signal的包装类模板 模板 类信号{ typedef typename boost::signals2::signal SignalType; 公众: //触发信号 void运算符(){sig();} //附加一个侦听器 boost::signals2::连接运算符+=(常量类型名称SignalType::插槽类型和插槽)

我正在为
boost::signals2::signal
编写一个包装器,以获得一个更干净、更易于使用的界面。以下是我的想法:

#包括
//boost::signals2::signal的包装类模板
模板
类信号{
typedef typename boost::signals2::signal SignalType;
公众:
//触发信号
void运算符(){sig();}
//附加一个侦听器
boost::signals2::连接运算符+=(常量类型名称SignalType::插槽类型和插槽)
{返回信号连接(插槽);}
私人:
信号类型sig;
};
生成事件的类{
公众:
无效生成事件(int n){
而(n-->0){
发生了什么事;
}
}
发出发生事情的信号;
};
void func()
{
;
}
列出事件的类{
公众:
列出事件的类(生成事件和ev的类){
接收的\u计数=0;
//这很有效
ev.SomethingOccessed+=func;
//这可不行!
ev.somethingOccessed+=bind(&classthattlistensforevents::事件处理程序,this,_1);
}
无效事件处理程序(){
接收到的_计数++;
}
接收到的int_计数;
};
我不确定这是否是我能想到的最好的包装器接口,让某件事情发生在一个公共成员身上可能有一些缺点。虽然我不介意听到你们对这件事的看法,但这并不是问题所在


我想知道的是如何将回调传递给
+=
操作符。正如我在Listensforevents的
类中所写的那样,对函数的回调没有问题,但是使用结果
bind
会产生大量难以读取的模板编译器错误。

您的信号具有
void()
签名,因此它不需要参数。您正试图分配一个带有一个参数的
boost::bind
对象(因为它使用
\u 1
),这是不兼容的。因此,您会得到一个错误。不清楚您希望
ev
参数
event\u handler
来自何处。如果您绑定的是实际值而不是
\u 1
,则签名将兼容。

您的信号具有
void()
签名,因此它不带任何参数。您正试图分配一个带有一个参数的
boost::bind
对象(因为它使用
\u 1
),这是不兼容的。因此,您会得到一个错误。不清楚您希望
ev
参数
event\u handler
来自何处。如果您绑定了一个实际值而不是
\u 1
,那么签名将是兼容的。

信号和回调的签名不同,我认为这是错误的

信号和回调的签名不同,我认为这是错误的

谢谢,但这只是实际代码中没有出现的打字错误。我已经更新了这个问题。谢谢,但这只是一个在真实代码中没有出现的输入错误。我已经更新了这个问题。在你开始编写这样一个包装器之前,这一部分值得一读。我曾经读过一次,在Boost的一般上下文中,我同意这一点,但在我的应用程序上下文中,我是决定的人,我有点喜欢干净的接口,缺点对我来说不是什么大问题。但是
+=
只是糖类,编写包装器的真正原因是向类的用户隐藏
boost::signals2::signal
类,以降低复杂性并允许将来进行其他实现。在开始编写此类包装器之前,这一部分值得一读。我已经读过一次,我同意Boost的一般上下文,但在我的应用程序上下文中,我是决定的人,我有点喜欢干净的界面,缺点对我来说不是什么大问题。但是
+=
只是糖,编写包装器的真正原因是向类的用户隐藏
boost::signals2::signal
类,以降低复杂性并允许将来进行其他实现。