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

C++ Boost Signals connecting two functions from two different classes in template

本文关键字:两个 同类 函数 Boost 信号 c++ 连接      更新时间:2023-10-16

我试图在一个类中的函数之间建立连接,以便我可以在另一个类中调用它。我找到的答案要么太具体,要么可能我错过了一些东西,因为我一辈子都不知道我做错了什么。此外,我对boost库有点陌生,所以请原谅我可能会问的任何愚蠢的问题。

我的工作流程的设置基本上是这样的…

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上。

您应该连接到与slot匹配的signal a,这是一个具有适当签名的可调用。最好的解决方案是将插槽创建留给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);
}