7

あるクラスのブースト信号を別のクラスの信号に直接接続するためのより良い方法があるかどうか疑問に思いました。

たとえば、独自の信号を提供する多数のメンバーがいるファサードクラスを想像してみてください。ここで、ファサードがこれらの信号を公開したいとします。私は通常、定型的なメソッドを作成し、それをシグナルハンドラーとして接続します。

using namespace boost::signal;

class A
{
public:
  A(){};
  virtual ~A(){};

  signal<void()> signalA;
};

class B
{
public:
  B(){};
  virtual ~B(){};

  signal<void()> signalB;
};

class Facade
{
private:
  A& a;
  B& b;

public:
  Facade(A& refA, B& refB) 
  : a(refA), b(refB) 
  {
    // connect A's signal to facadeSignalA
    a.signalA.connect(boost::bind(&Facade::forwardedSignalA, this));
    // connect B's signal to facadeSignalB
    b.signalB.connect(boost::bind(&Facade::forwardedSignalB, this));
  }
  virtual ~Facade() {};

  // user visible signals
  signal<void()> facadeSignalA;
  signal<void()> facadeSignalB;

private:
  // ugly boilerplate code used to forward signals
  void forwardedSignalA()
  {
    facadeSignalA();
  }
  void forwardedSignalB()
  {
    facadeSignalB();
  }
};

現在、これはあまりエレガントではなく、しばらくすると非常に面倒になります。これらの種類の転送メソッドを作成せずにこれを行う方法はありますか?

4

1 に答える 1

9

はい、信号を直接「チェーン」できることがわかりました。このスレッドをご覧ください。文書化されていませんが、非常に便利な機能のようです。

于 2012-08-05T12:20:56.920 に答える