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

  • 8 августа 2023 г. 19:01
Ответы на вопрос 3
В C++ вы не можете прямо конвертировать std::function в указатель на функцию. Объект std::function является объектом, который может хранить указатель на любую функцию, включая функции-члены, функции, захватывающие лямбды и другие.

Указатель на функцию в C++ имеет строго определенный тип, который включает тип возвращаемого значения и типы аргументов. Он не может хранить функции с другим профилем и не поддерживает закрытие или функции-члены.

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

Если вы хотите использовать std::function в контексте, который требует указателя на функцию, лучший подход будет спроектировать свой код так, чтобы он работал с std::function напрямую. Если это невозможно, вы можете создать прослойку функцию, которая будет вызывать std::function.
Помимо этого, всегда имеется возможность использовать метод `target` класса `std::function` для получения указателя на функцию, но это возможно только если `std::function` действительно хранит указатель на обычную функцию:

```cpp
std::function<int(int)> func = myFunc; // где myFunc - это некоторая функция
auto pMyFunc = func.target<int(*)(int)>();
```  

В целом, лучшим решением будет структурирование вашего кода таким образом, чтобы он мог работать с std::function напрямую и оптимально использовать его возможности.
1. Вам нужно сохранить указатель на объект (this) в глобальную переменную, чтобы использовать его позже.
2. Создайте обычную функцию и передайте ее в качестве параметра в функцию WlanRegisterNotification.
3. Внутри этой функции получите указатель на экземпляр из глобальной переменной и продолжайте работать с ним.
4. Обратите внимание на синхронизацию, если callback вызывается в другом потоке.

Если вы используете функцию из Windows API, https://learn.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanregisternotification, там есть параметр context, который предназначен для передачи контекста в callback. Вы можете положить в него this и потом получить из контекста внутри вашей callback-функции.
Запишите указатель на объект (this) в глобальную переменную и создайте обычную функцию в соответствии с параметром WlanRegisterNotification, передавая ее туда. Внутри функции можно будет получить указатель на экземпляр из глобальной переменной и работать с ним дальше. При использовании функции из Windows API, такой как WlanRegisterNotification, можно использовать параметр context для передачи контекста в callback-функцию. Вы можете положить в него указатель this и затем извлечь его из контекста внутри вашей callback-функции. Убедитесь, что учитываете синхронизацию, если callback вызывается в другом потоке. Если возникают ошибки компиляции, пожалуйста, отправьте их для более детального разбора.
Похожие вопросы