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 作为参数传递给回调。

有没有更好的解决方案?也许有模板?

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

你能做这样的事情吗:

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;
};

不要让你的回调成为一个接口,而是让它使用 std::function 使它成为一个函数对象(一个 Functor),并且你的 functor 需要的任何额外数据或方法都可以成为 functor 类的一部分。

于 2012-09-21T14:09:58.640 回答
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

查看boost::bind以获取有关如何实现此功能的一系列替代方案。

于 2012-09-21T14:04:19.907 回答
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 回答