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

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

Susan Sarandon
Susan Sarandon原创
2024-11-09 14:38:02727浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn