如何使用std :: function作为C风格的回调

时间:2013-11-29 17:01:19

标签: c++ c++11 callback

如何在需要C风格回调的函数中使用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;
}

int main() {
    std::function<void(int)> myf = std::bind(&foo, "test", std::placeholders::_1, 3.f);
    register_callback(myf); // <-- How to do this?
}

2 个答案:

答案 0 :(得分:13)

在大多数情况下,你不能。

但是如果你在std :: function中存储了一个C风格的回调函数,你可以使用target()成员函数。

答案 1 :(得分:11)

答案很长:有点儿。您可以编写一个C函数来传递给调用std::function

的API
// --- 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?
}