1

インターフェイスを使用してコールバックを実装しました..

struct ICallback
{
  virtual bool operator()() const = 0;
};

およびコールバックを追加する関数

void addCallback(const ICallback* callback) { .... }

そして使用、コールバックはいくつかのクラスにあります

class BusImplemantation{
public:
    struct Foo : ICallback
    {
       virtual bool operator()() const { return true;}
    }foo;
    void OtherMethod();
    int OtherMember;       
};

しかし、コールバックはクラス(関数/メソッドではない)であるため、コールバック内でOtherMethodおよびOtherMemberにアクセスできません。コールバックがクラスではなく、メソッドのみの場合は可能です。(内部クラスとメソッド)

OtherMethod と OtherMember を callback にパラメーターとして渡すことはできません。

そのためのより良い解決策はありますか?多分テンプレートで?

4

5 に答える 5

2

使用std::function:

void addCallback(const std::function<bool()>) { .... }

class BusImplemantation{
public:
    bool Callback() { return true; }
    void OtherMethod();
    int OtherMember;       
};

BusImplemantation obj;
addCallback(std::bind(&BusImplemantation::Callback, obj));
于 2012-09-21T14:19:29.673 に答える
1

これを実装する方法については、boost::bindを参照してください。

于 2012-09-21T14:04:19.907 に答える
1

フリー関数の代わりにコールバック オブジェクトを使用することの要点は、それらに任意の状態を関連付けることができるということです。

class BusImplemantation{
public:
    struct Foo : ICallback
    {
       explicit Foo(BusImplementation &p) : parent(p) {} 
       virtual bool operator()() const;

    private:
       BusImplementation &parent;
    } foo;

    BusImplementation() : foo(*this)
    {
        addCallback(&foo)
    }

    void OtherMethod();
    int OtherMember;       
};

bool BusImplementation::Foo::operator() () const
{
    if (parent.OtherMember == 0) {
        parent.OtherMethod();
        return false;
    }
    return true;
}
于 2012-09-21T15:37:09.300 に答える
1

Could you do something like this instead:

typedef std::function<bool()> CallbackFunc;
void addCallback(const CallbackFunc callback) { .... }

class BusImplemantation{
public:
    struct Foo
    {
       Foo(member) : OtherMember(member) { }

       bool operator()() const { return true; }

       void OtherMethod();
       int OtherMember;       
    }foo;
};

Instead of making your callback an interface, make it use std::function to make it a function object (a Functor), and any extra data or methods that your functor needs can be a part of the functor class.

于 2012-09-21T14:09:58.640 に答える
0

私はあなたのICallbackインターフェースがベースインターフェースを持つ制御されたクラスへのポインターを持っている必要があると思います、それBusImplemantationを仮定し、コールバック内でこのポインターを使用します。

struct ICallback
{
  virtual bool operator()() const = 0;
  void setControlObject(BusImplemantation* o)
  {
    obj = o;
  }
  BusImplemantation* obj;
};

class BusImplemantation
{
public:
    void addCallback(const ICallback* callback)
    { 
       callback->setControlObject(this);
    }
    void OtherMethod();
    int OtherMember;       
};

そして使用:

class SomeCb : ICallback
{
   bool operator()
   {
       obj->OtherMethod();
       return true;
   }
}
于 2012-09-21T14:30:41.237 に答える