0

あるクラスの関数を接続して、別のクラスで呼び出せるようにしようとしています。私が見つけた答えは具体的すぎるか、何かが欠けているのかもしれません。また、私は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を使っています。

4

1 に答える 1

1

適切な署名を持つcallableであるsignal一致する に接続する必要があります。最善の解決策は、スロットの作成を関数の呼び出し元に任せることです (以下はSSCCE形式のコードです)。slotaddListener

#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);
}
于 2013-05-15T19:37:44.837 に答える