Как использовать функцию std:: как обратный вызов стиля C
Как я могу использовать std::function
в функции, которая ожидает обратного вызова C-стиля?
Если это невозможно, то что лучше?
Пример:
// --- some C code I can not change ---
typedef void(*fun)(int);
void register_callback(fun f) {
f(42); // a test
}
// ------------------------------------
#include <functional>
#include <iostream>
void foo(const char* ptr, int v, float x) {
std::cout << ptr << " " << v << " " << x << std::endl;
}
int main() {
std::function<void(int)> myf = std::bind(&foo, "test", std::placeholders::_1, 3.f);
register_callback(myf); // <-- How to do this?
}
Ответы
Ответ 1
Длинный ответ: вроде. Вы можете написать функцию C, чтобы перейти к API, который вызывает ваш std::function
:
// --- some C code I can not change ---
typedef void(*fun)(int);
void register_callback(fun f) {
f(42); // a test
}
// ------------------------------------
#include <functional>
#include <iostream>
void foo(const char* ptr, int v, float x) {
std::cout << ptr << " " << v << " " << x << std::endl;
}
namespace {
std::function<void(int)> callback;
extern "C" void wrapper(int i) {
callback(i);
}
}
int main() {
callback = std::bind(&foo, "test", std::placeholders::_1, 3.f);
register_callback(wrapper); // <-- How to do this?
}
Ответ 2
В большинстве случаев вы не можете.
Но когда вы сохраняете обратный вызов в стиле C в вашей std::function
, вы можете использовать функцию-член target()
.