在某些情况下,可能需要将 Boost::function 传递给预期标准的方法函数指针(展示相同的签名)。这可能会导致编译错误。
typedef void TriggerProc_type(Variable*, void*); void InitVariable(TriggerProc_type *proc); boost::function<void (Variable*, void*)>& triggerProc ... InitVariable(triggerProc); // Error: cannot convert parameter 1
消除 Boost::function 并引用绑定函子会立即导致类似的错误:
error C2664: 'blah(void (__cdecl *)(type *,void *))' : cannot convert parameter 1 from 'boost::_bi::bind_t<R,F,L>>' to 'void (__cdecl *)(type *,void *)'
普遍接受的解决方案是有限的,因为它只能在微不足道的情况下成功运行。更有效的方法是使用 shim 函数,该函数遵守回调签名,确定要调用的适用 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 传递给需要函数指针的方法?的详细内容。更多信息请关注PHP中文网其他相关文章!