Как преобразовать std::function в указатель на функцию?

Имеется функция WlanRegisterNotification, у которой один из аргументов имеет тип void (*callback)(PWLAN_NOTIFICATION_DATA, PVOID).
Необходимо сделать вывод окна QMessagebox если wifi отключится.
Проблема: для вывода окна нужен this (класса, который связан с QWidget), для этого хорошего подходит лямбда.
Но лямбду нужно сконвертировать в указатель на функцию (выше).
std::function<void(PWLAN_NOTIFICATION_DATA data, PVOID context)> callback = [](PWLAN_NOTIFICATION_DATA data, PVOID context){
QMessagebox::warning(this,"WIFI","WIFI отключился");
};
 WlanRegisterNotification(callback); //не работает: нужен указатель на функцию, а не std::function
  • Вопрос задан
  • 169 просмотров
Пригласить эксперта
Ответы на вопрос 2
@sergiodev
Как вариант можно так сделать:

1. Запомнить указатель на объект (this) в какую-то глобальную переменную
2. Создать обычную функции в соответствии с параметром WlanRegisterNotification и передать её туда
3. В теле функции достать указатель на экземпляр из глобальной переменной и далее работать с ним

Возможно, ещё нужно учесть синхронизацию, если callback вызывается в другом потоке.

Если вы работаете с функцией https://learn.microsoft.com/en-us/windows/win32/ap... из Windows API, то там есть параметр context как раз для передачи контекста в callback. Можно положить туда this и позже достать из контекста внутри вашей callback-функции.
Ответ написан
@Xiran
Как-то так:
auto callback = [](auto, void *data) {
	QMessagebox::warning(reinterpret_cast</* Имя класса */>(data), "WIFI", "WIFI отключился");
}

WlanRegisterNotification(/* ... */, callback, this, /* ... */);


void* - тоже самое, что и PVOID.
Если будут ошибки компиляции, отправьте их.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы