C ++ Boost信号连接模板中两个不同类的两个函数

时间:2013-05-14 20:46:45

标签: c++ boost boost-signals2

我正在尝试在一个类中的函数之间建立连接,以便我可以在另一个类中调用它。我发现的答案要么太具体,要么就是我错过了什么,因为我不能为我的生活弄清楚我做错了什么。另外,我对升级库有点新意,所以请原谅我可能会问的任何愚蠢的问题。

我的工作流程的设置基本上就是这个......

class MyClass : public BaseClass {

  void setup();
  void myFunc(datatype);

  OtherClass myOtherClass;

}

void setup()
{
   OtherNamespace::addListener(this, myOtherClass);
}

namespace OtherNamespace {

class OtherClass {

  signals::signal<void (datatype)> myConnection;

}

template<class A, class B>
void addListener(A * app, B & connection)
{
   connection.myConnection.connect( 'I don't know what to do here' );
}
}

基本上,addlistener函数不会在信号和函数之间建立连接。我知道我不知道该怎么办我做错了什么但是我无法弄清楚它是错的。我将它作为辅助函数,以便我可以将函数从一个类传递到另一个类,然后在它们被连接时调用它们。我正在尝试从websocket连接创建一个多米诺骨牌事件,我显然错过了一些非常重要的事情。任何帮助都会得到真正的赞赏。

我正在使用xcode和boost以及macbook pro。

1 个答案:

答案 0 :(得分:1)

您应该连接到signal匹配的slot,这是一个具有相应签名的可调用。最佳解决方案是将广告位创建留给addListener函数的来电者(以下是您的代码,采用SSCCE形式):

#include <boost/signals2.hpp>

typedef int datatype;
class BaseClass
{};

namespace OtherNamespace 
{
  class OtherClass 
  {
  public:
    boost::signals2::signal<void (datatype)> myConnection;
  };

  template<class A, class B>
  void addListener(A app, B & connection)
  {
     connection.myConnection.connect(app);
  }
}

class MyClass : public BaseClass 
{
public:

  void setup();
  void myFunc(datatype)
  {}

  OtherNamespace::OtherClass myOtherClass;

};

void MyClass::setup()
{
   // let the caller decide how to make the slot
   OtherNamespace::addListener(boost::bind(&MyClass::myFunc, this, _1), myOtherClass);
}