У меня есть класс CallbackUser, который должен хранить обратный вызов для функций класса A или для функций подкласса B.
Я бы хотел, чтобы CallbackUser сохранял обратный вызов как std :: functionтак что при выдаче обратного вызова ему не нужно выполнять какие-либо особые или динамические трансляции.CallbackUser свяжет обратный вызов со своим объектом как std :: function и вызовет его, не зная, что внутри.
Есть ли способ для CallbackUser иметь своего рода полиморфный обратный вызов A и его подклассов, без необходимостизнаете, какой класс или метод он на самом деле вызывает?
callback.h
class A {
public:
A() {};
void method1() { cout << "method1" << endl; }
void method2() { cout << "method2" << endl; }
};
class B : public A {
public:
B() {};
void derived1() { cout << "derived1" << endl; }
void derived2() { cout << "derived2" << endl; }
};
class CallbackUser {
public:
CallbackUser() {};
void set(
function< void (void) > const& callback,
A* target
) {
myCallback = bind( callback, target );
}
void issueCallback() {
myCallback();
}
private:
std::function< void () > myCallback;
};
callback.cpp
#include "callback.h"
int main() {
A* a = new A;
B* b = new B;
CallbackUser* user = new CallbackUser;
std::function< void (void) > callback;
callback = std::bind( &A::method1, a);
user->set( callback, a );
user->issueCallback();
callback = &B::method1;
user->set( callback, b );
user->issue();
}
Ошибка компиляции во время связывания:
function not viable: no known conversion from '__bind<const std::__1::function<void ()> &, A
*&>' to 'const std::__1::function<void ()>' for 1st argument