提升信号时隙泛化

时间:2014-01-31 17:29:45

标签: c++ boost boost-signals

我正在寻找一种方法来实现类似的东西,使用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
    }
 };

如何实现这一目标。信号复制是不可能的!?

1 个答案:

答案 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对象。