【问题标题】:boost signal-slot generalisation增强信号槽泛化
【发布时间】:2014-01-31 17:29:45
【问题描述】:

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

如何做到这一点。无法进行信号复制!?

【问题讨论】:

  • 这个应该是什么?
  • @itwasntpete - 下面的代码。我的意思是我试图像上面那样实现。但我做不到。
  • 制作 boost::signals 指针或共享指针。
  • 真的有可能制作一个已经在类中声明的信号,例如。 class A{ public: boost::signal&lt;void(bool)&gt; a_sig; }; 共享指针?我知道获取共享指针的可能方法是使用make_sharedctorshared_ptr

标签: c++ boost boost-signals


【解决方案1】:

我不是 100% 确定您的意图,但假设 onSignal() 不需要与 m_signal 交互(并且您只需要与 m_signal 的一个连接),看来您可以解耦 @987654324 @ 完全来自你的班级。例如,如果您真的不希望在设置“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
    }
};

请注意,我从m_signal.connect(boost::bind(&amp;GebBoost::onSignal,this,_1)); 中删除了最后一个_1,因为信号被声明为void(void) 类型,因此应该连接到void 回调。我还添加了 scoped_connection,这样如果 GenBoost 类型的对象在它连接到的信号之前被销毁,它将自动断开连接,而不是让信号保留无效的指针。

或者,如果您需要保留对原始信号的引用,您可以添加回原始信号成员,但作为指针 boost::signal&lt;void(void)&gt;* 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 对象长。

【讨论】:

  • 有关 scoped_connection 的信息很有用。这正是我一直在寻找的。谢谢。
猜你喜欢
  • 2016-11-14
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多