Я реализую метод обратного вызова внутри класса, в настоящее время работающая реализация использует 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;
}