0

我正在寻找一种方法来实现这样的事情,使用 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
    }
 };

这怎么可能实现。信号复制是不可能的!?

4

1 回答 1

2

我不能 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
    }
};

请注意,我删除了最后一个_1m_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对象长。

于 2014-01-31T19:02:56.383 回答