gpt4 book ai didi

c++ - std::function到C样式的函数指针

转载 作者:行者123 更新时间:2023-12-03 07:15:28 27 4
gpt4 key购买 nike

我正在使用用C编写的库。该库接受如下回调:

int(*)(int arg, void* user_param)
是否可以创建 std::function<int(int, void*)>并将其作为回调传递给该库?
我知道 std::function有一个 target方法,该方法返回存储函数的地址,但是据我所知,如果它持有lambda表达式,则无法返回该地址。还是我错了?

最佳答案

您可以将lambda函数与C样式函数指针一起使用,只是不使用std::function
没有捕获的Lambda可以转换为函数指针:

using callback_t = int(*)(int arg, void* user_param);
void set_c_callback(callback_t, void* user_param);

// ...

void foo() {
set_c_callback([](int a, void* data) {
// code
}, nullptr);
}
但是,lambda也可以使用 std::any进行捕获:
// The storage can be inside a class instead of a global
std::any lambda_storage;

template<typename T>
void foo(T lambda) {
lambda_storage = lambda;
set_c_callback([](int n, void* user_data) {
auto& lambda = *std::any_cast<T>(static_cast<std::any*>(user_data));
lambda(n);
}, &lambda_storage)
}

// ...

foo([k = 1](int n) {
std::cout << n + k << std::endl;
});

关于c++ - std::function到C样式的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64596126/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com