如何使用接口实现回调

Mel*_*oun 2 c++ interface callback

我有一个需要更多回调的类..我试图用接口实现它们:

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

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

}
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

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

error: argument of type 'bool (Main::)()' does not match 'bool (CallbacksInterface::*)()'
Run Code Online (Sandbox Code Playgroud)

我认为有一个模板的解决方案,但我正在编程嵌入式设备,我的编译器是有限的.

jua*_*nza 6

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

struct ICallback
{
  virtual bool operator()() const = 0;
};
Run Code Online (Sandbox Code Playgroud)

并根据需要多次实施:

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

struct Bar : ICallback
{
  virtual bool operator()() const { return false;}
};
Run Code Online (Sandbox Code Playgroud)

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

class BusImplemantation{
public:
    void addRequest(const ICallback* callback) { .... }
};
Run Code Online (Sandbox Code Playgroud)

然后

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

bus.addRequest(&foo);          
bus.addRequest(&bar);
Run Code Online (Sandbox Code Playgroud)

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

  • @Meloun ``operator()`` 使实例“可调用”。我在代码中添加了一些注释。如果你有一个 ``ICallback*``,你可以这样调用操作符:``pCakkBack->operator()();`` (2认同)