Самая простая нативная реализация или эквивалентная std :: function для использования в функции обратного вызова - PullRequest
1 голос
/ 18 марта 2020

Я реализую метод обратного вызова внутри класса, в настоящее время работающая реализация использует std::function, однако STL недоступен в среде, которую я использую. Я пытаюсь понять, как нативная реализация могла бы достичь того же результата. Я попытался использовать указатели функций, это не работает для обратных вызовов лямбда-выражений.

Вот рабочий пример того, чего я пытаюсь достичь, используя std::function.

#include <iostream>
#include <functional>

using namespace std;
class MyClass {
    public:
        MyClass(std::function<void(void)> callback): _callback(callback) {}
        void call() {
            _callback();
        }
    private:
        std::function<void(void)> _callback;
};

class MyOtherClass {
    public:
        MyOtherClass() {}
        MyClass mc = MyClass([this]() { myInt++; });
        void callFiveTimes() {
            for(int i = 0; i < 5; i++) {
                mc.call();
            }
        }
        void printInt() {
            cout << myInt << endl;
        }
    private:
        int myInt = 0;

};


int main()
{
    MyOtherClass moc = MyOtherClass();
    moc.printInt();
    moc.callFiveTimes();
    moc.printInt();
    return 0;
}

. , вопрос в том, как заменить std::function<void(void)> callback так, чтобы программа компилировалась без внешних библиотек.

Обновление:

Вот пример, который требует немного больше работы, но достигает результата Я после. Я хотел бы иметь возможность просто передать обратный вызов в качестве параметра, а не обратный вызов, и параметр args обратного вызова.

#include <iostream>

using namespace std;
class MyClass {
    public:
        MyClass(void(*callback)(void*), void* callback_arg): _callback(callback), _callback_arg(callback_arg) {}
        void call() {
            _callback(_callback_arg);
        }
    private:
        void (*_callback)(void*);
        void* _callback_arg;
};

class MyOtherClass {
    public:
        MyClass* mc;
        MyOtherClass() {
            auto callback=[this](){ myInt++; };
            mc = new MyClass([](void* arg){ (*static_cast<decltype(callback)*>(arg))(); },&callback);
        }
        void callFiveTimes() {
            for(int i = 0; i < 5; i++) {
                mc->call();
            }
        }
        void printInt() {
            cout << myInt << endl;
        }
    private:
        int myInt = 0;

};


int main()
{
    MyOtherClass moc = MyOtherClass();
    moc.printInt();
    moc.callFiveTimes();
    moc.printInt();
    return 0;
}
...