0
  class Action {
    public:
      void operator() () const;
  }

  class Data {
    public:
      Data();
      ~Data();
      Register(Action action) { _a = action; }

    private:
      Action _a;
   }

  class Display {
    public:
      Display(Data d) { d.Register( bind(Display::SomeTask, this, _1) ); }
      ~Display();
      void SomeTask();
  }

Data のプライベート メンバー _a を Display のメンバー関数にバインドしたいのですが、d.Register を呼び出すと引数の型が一致しないというコンパイル エラーが発生します。ありがとう。

4

3 に答える 3

4

あなたがしようとしていることは完全には明らかではありませんが、「バインド」はboost::bind (またはtr1::bind)であると仮定します。

bind(Display::SomeTask, this, _1) に関するいくつかの問題:

  • &Display::SomeTask である必要があります
  • _1 プレースホルダーは、単項関数オブジェクトを作成し、次のことを行うため意味がありません。
    • Display::SomeTask は引数を取らない
    • Action::operator() は引数を取りません

Boost.Function と Boost.Bind を使用して、あなたがやろうとしていることを達成するために書くことができるものは次のとおりです。

typedef boost::function<void(void)> Action;

class Data {
public:
  Data();
  ~Data();
  Register(Action action) { _a = action; }

private:
  Action _a;
};

class Display {
public:
  Display(Data d) { d.Register( bind(&Display::SomeTask, this) ); }
  ~Display();
  void SomeTask();
};
于 2009-08-06T15:46:56.450 に答える
0

まず、戻り値の型を使用&Display::SomeTaskRegisterて指定する必要があります。その後は、必要に応じて異なります

  • ラッパーはSomeTaskonを呼び出す必要があります*this: 省略し_1ます。
  • ラッパーはSomeTask、渡されたDisplayオブジェクトを呼び出す必要があります: Shift_1の代わりにthis.

次に、boost::bind指定された関数を呼び出す複雑な合成型を返します。それを保管する方法が必要ですboost::function。これはあなたがそれを行う方法です

  class Display; // forward-declaration
  class Data {
    public:
      Data();
      ~Data();

      template<typename Action>
      void Register(Action action) { _a = action; }

    private:
      boost::function<void(Display&)> _a;
      // if wrapper should call it on `*this`
      // boost::function<void()> _a;
   }

  class Display {
    public:
      // this currently makes no sense. You pass a copy. Probably you
      // should consider pass-by-reference or processing "d" further. 
      Display(Data d) { d.Register( bind(&Display::SomeTask, _1) ); }
      // wrapper should call it on `*this`:
      // Display(Data d) { d.Register( bind(&Display::SomeTask, this) ); }
      ~Display();
      void SomeTask();
  }

その後、動作するはずです。

于 2009-08-06T15:47:27.087 に答える