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