如何将无参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
相关产品推荐
相关产品推荐

