首页 > 后端开发 > C++ > 如何将 Boost::function 传递给需要函数指针的方法?

如何将 Boost::function 传递给需要函数指针的方法?

Mary-Kate Olsen
发布: 2024-11-14 16:44:02
原创
460 人浏览过

How to Pass a Boost::function to a Method Expecting a Function Pointer?

从 Boost::function 派生普通函数指针

在某些情况下,可能需要将 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

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板