首页 >后端开发 >C++ >如何安全地将 `boost::function` 传递给普通函数指针?

如何安全地将 `boost::function` 传递给普通函数指针?

Linda Hamilton
Linda Hamilton原创
2024-11-10 13:19:03210浏览

How to Safely Pass a `boost::function` to a Plain Function Pointer?

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

问题:

传递boost::function 作为一个普通函数指针,具有与需要的方法相同的签名,可能会导致错误,例如如 C2664。

解决方案:

虽然一些答案建议使用 target() 从 boost::function 检索指针,但这仅适用于以下情况:最初绑定的对象有资格绑定到 C 回调。

对于重要情况,boost::function 的底层机制需要多个指针,而不仅仅是一个。因此,更稳健的解决方案是创建一个符合回调签名的 shim 函数,并将调用委托给存储为用户数据的 boost::function。

示例:

// Shim function for callback
typedef void (*CallbackType)(int x, void* user_data);
void MyCallback(int x, void* userData) {
    boost::function<void(int)>& pfn = static_cast<boost::function<void(int)> &>(userData);
    pfn(x);
}

// Usage
boost::function<void(int)> fn = boost::bind(myFunction(5));
RegisterCallback(MyCallback, &fn);

此方法允许将 boost::function 与包含用户数据的 C 回调一起使用。但是,如果回调签名缺少用户数据指针,则可能需要完全重新设计才能在大多数情况下可用。

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

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