Связывание std :: function с различными функциями-членами класса - PullRequest
0 голосов
/ 14 марта 2019

У меня есть класс 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
...