我正在寻找一种方法来实现类似的东西,使用boost
class GenBoost{
boost::signal<void(void)> m_signal;
std::function<void (bool)> m_function
public:
void setSignal(boost::signal<void(void)> sigArg)
{
m_signal = sigArg;
}
void setFunction(std::function<void (bool)> &functionArg)
{
m_function = functionArg;
m_signal.connect(boost::bind(&GebBoost::onSignal,this,_1));
}
void onSignal(){
//do something
}
};
如何实现这一目标。信号复制是不可能的!?
答案 0 :(得分:2)
我不是百分之百确定您的意图,但假设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
对象。