首页 > 后端开发 > C++ > 如何将 `boost::function` 传递给需要普通函数指针的 C 回调?

如何将 `boost::function` 传递给需要普通函数指针的 C 回调?

Susan Sarandon
发布: 2024-11-09 14:38:02
原创
775 人浏览过

How to Pass a `boost::function` to a C Callback Expecting a Plain Function Pointer?

将 Boost::function 降级为普通函数指针

Boost::function 是管理函数指针的多功能工具,但它可以与需要普通函数指针的 C 回调一起使用具有挑战性。本文探讨了这个问题的复杂性,并使用 shim 函数提供了一个可靠的解决方案。

当尝试将绑定的 boost::function 直接传递给需要具有相同签名的普通函数指针的方法时,就会出现问题。由于函数指针表示的差异,这会导致编译器错误。

接受的答案建议使用 boost::function::target() 来检索底层函数指针,但这种方法有局限性。它仅适用于使用可以绑定到 C 回调的函数指针构造 boost::function 的简单情况。

为了解决这个问题,更可靠的方法是创建一个满足以下条件的填充函数:回调签名并将调用分派给适当的 boost::function。这可以通过将 boost::function 指针作为用户数据存储在回调函数中来实现。

以下是如何使用此方法的示例:

typedef void (*CallbackType)(int x, void* user_data);
void RegisterCallback(CallbackType cb, void* user_data);

void MyCallback(int x, void* userData) {
  boost::function<void(int)> pfn = static_cast<boost::function<void(int)>>(userData);
  pfn(x);
}

boost::function<void(int)> fn = boost::bind(myFunction(5));
RegisterCallback(MyCallback, &fn);
登录后复制

此解决方案提供即使回调签名不包含用户数据指针,也是使用 boost::function 和 boost::bind 与 C 回调的干净可靠的方式。

以上是如何将 `boost::function` 传递给需要普通函数指针的 C 回调?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板