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