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)
我认为有一个模板的解决方案,但我正在编程嵌入式设备,我的编译器是有限的.
一种更简单的方法是定义表示函数的单个接口类型:
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并完全避免使用公共接口.
| 归档时间: |
|
| 查看次数: |
5022 次 |
| 最近记录: |