我不能 100% 确定您的意图,但假设onSignal()
不需要与 交互m_signal
(并且您只需要与 的一个连接m_signal
),您似乎可以m_signal
完全与您的课程脱钩。例如,如果您真的不希望在设置“m_function”之前调用“onSignal()”的主体,则可以执行以下操作:
class GenBoost{
std::function<void (bool)> m_function;
boost::signals::scoped_conection m_connection;
public:
void setSignal(boost::signal<void(void)>& sigArg)
{
m_connection = sigArg.connect(boost::bind(&GebBoost::onSignal,this));
}
void setFunction(std::function<void (bool)> &functionArg)
{
m_function = functionArg;
}
void onSignal()
{
if ( m_function )
do_work();
}
void do_work()
{
//do something
}
};
请注意,我删除了最后一个_1
,m_signal.connect(boost::bind(&GebBoost::onSignal,this,_1));
因为信号被声明为类型void(void)
,因此应该连接到void
回调。我还添加了 scoped_connection,这样如果类型的对象GenBoost
在它连接到的信号之前被销毁,它将自动断开连接,而不是让信号保留无效指针。
或者,如果您需要保留对原始信号的引用,您可以添加回原始信号成员,但作为指针boost::signal<void(void)>* m_signal;
。然后setSignal
变成:
void setSignal(boost::signal<void(void)>& sigArg)
{
m_signal = &sigArg;
m_connection = m_signal->connect(boost::bind(&GebBoost::onSignal,this));
}
我仍然建议使用范围连接和连接,setSignal
以确保您只有一个连接到一个信号(如果setSignal
被调用两次,与第一个信号的连接会自动断开)。如果你走指针路由,你必须在外部确保传入的信号的生命周期比GenBoost
对象长。