将 boost::function 降级为普通函数指针
处理 boost::function 时面临的常见挑战之一是需要将其转换为普通函数指针。当与期望具有特定签名的函数指针的代码交互时,会出现这种情况,而可用函数封装在 boost::function 中。
问题
考虑以下内容代码:
typedef void TriggerProc_type(Variable*,void*); void InitVariable(TriggerProc_type *proc); boost::function<void (Variable*, void*)> triggerProc ... InitVariable(triggerProc);
编译此代码将导致以下错误:
error C2664: 'InitVariable' : cannot convert parameter 1 from 'boost::function<Signature>' to 'void (__cdecl *)(type *,void *)'
解决方案
建议的解决方案问题在于创建一个符合预期回调签名的填充函数:
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);
在此示例中,MyCallback 充当填充函数,将 boost::function 转换为兼容的回调。用户数据参数用于存储 boost::function 对象,允许 MyCallback 使用简单的强制转换来访问和执行它。
为什么直接绑定并不总是可行
需要注意的是,虽然直接绑定绑定函子是一种选择,但它可能并不总是合适。不平凡的 boost::function对象通常需要多个指针,这使得直接转换为 C 风格回调具有挑战性。
结论
通过使用像 MyCallback 这样的填充函数,可以有效地桥接boost::function 和 C 风格回调之间的差距。这种方法可以实现无缝集成,并可以在需要普通函数指针的场景中使用 boost::function。
以上是如何将 boost::function 转换为普通函数指针?的详细内容。更多信息请关注PHP中文网其他相关文章!