3

我有一个需要更多回调的类。我正在尝试使用接口来实现它们:

class CallbacksInterface
{
public:
     virtual bool mycallback1() = 0;
     virtual bool mycallback2() = 0;
     virtual bool mycallback3() = 0;
};

Class BusImplementation{
public:
    addRequest(bool (CallbacksInterface::*callback)());

}

回调是addRequest()方法的参数,定义为接口方法的指针。所以我想添加请求..

//class with callbacks
class Main:CallbacksInterface{
public:
      bool mycallback1(){..};
      bool mycallback2(){..};
      bool mycallback3(){..};
      //.. 
}

BusImplemantation bus;
Main main;   

bus.addRequest(main.mycallback1);          
bus.addRequest(main.mycallback2);
bus.addRequest(main.mycallback3);

但我不能将回调传递给我的 BusImplementation 类

error: argument of type 'bool (Main::)()' does not match 'bool (CallbacksInterface::*)()'

我认为有一个带有模板的解决方案,但是我正在编写嵌入式设备并且我的编译器是有限的。

4

2 回答 2

9

一种更简单的方法是定义一个表示函数的接口类型:

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

并根据需要多次实施:

struct Foo : ICallback
{
  virtual bool operator()() const { return true;}
};

struct Bar : ICallback
{
  virtual bool operator()() const { return false;}
};

那么您的总线实现可以采用回调接口:

class BusImplemantation{
public:
    void addRequest(const ICallback* callback) { .... }
};

然后

BusImplemantation bus;
Foo foo;  // can be called: bool b = foo();
Bar bar;   // can be called: bool b = bar();

bus.addRequest(&foo);          
bus.addRequest(&bar);

您还可以使用std::function进行调查并完全避免使用公共接口。

于 2012-09-12T13:13:35.463 回答
1

我还强烈建议使用抽象接口。但是,如果您出于某种原因真的想要原始方法,则需要这样的东西:

void addRequest(bool (CallbacksInterface::*callback)(), CallbacksInterface* pTarget) {...}
...
bus.addRequest(&CallbacksInterface::mycallback1, &main); 
// ! Not &Main::mycallback1 - that wouldn't compile
...
// calling a callback
(pTarget->*callback)();
于 2012-09-12T13:57:37.363 回答