You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将无参std::function适配为带void*参数的函数指针?

解决方案

要实现无额外运行时开销的回调适配,核心是利用外部库提供的void*参数传递std::function<void()>的指针,再通过一个静态适配函数完成类型转换与调用:

代码实现

#include <functional>

// 模拟外部库的类型与函数
typedef void (*callback_type)(void *arg);
extern void external_register_callback(callback_type cb, void* arg);

// 适配函数:严格符合callback_type签名,无额外运行时开销
static void callback_adapter(void* arg) {
    // 直接转换指针并调用std::function,仅做类型转换无额外逻辑
    (*static_cast<std::function<void()>*>(arg))();
}

// 包装函数:接收无参std::function并注册到外部库
void my_register_callback(const std::function<void()>& callback) {
    // 将std::function的地址作为额外参数传递给外部库
    external_register_callback(callback_adapter, const_cast<std::function<void()>*>(&callback));
}

关键注意事项

  • 生命周期保证:传入my_register_callback的std::function<void()>对象,其生命周期必须覆盖外部库可能调用该回调的全部时长,否则会触发悬空指针访问。如果需要动态管理生命周期,可以将std::function分配在堆上(如用std::make_unique),但这会引入内存分配开销,需根据场景权衡。
  • 零额外开销:适配函数仅做指针类型转换与直接调用,没有多余分支或虚函数以外的开销(std::function本身的调用开销是其固有特性),完全符合要求。
  • C++20兼容性:代码使用标准C特性,无需额外依赖,完全兼容C20标准。

内容的提问来源于stack exchange,提问作者Johannes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:22:41