将通用引用强制转换为可调用的 void 指针,反之亦然
Casting a universal reference to a callable to void pointer and vice versa
我需要在接受可调用对象C++将回调机制包装在 C 接口中。 在 C 接口中有一个设置回调的方法:
void c_set_callback(void(*callback)(void* context), void* context);
这是我尝试用可调用对象包装它的尝试:
template<typename Function>
void set_callback(Function&& function)
{
c_set_callback
([](void* context)
{
(*reinterpret_cast<typename std::decay<Function>::type*>(context))();
}
, reinterpret_cast<void*>(&function)
);
}
但是我无法弄清楚为普遍提及"功能"提供上下文的正确方法。通过上面的实现,当从 lambda 中调用可调用对象时,我遇到了分段错误。
有关完整的代码示例,请参阅 https://onlinegdb.com/r1WeuBz08。
尽管将没有捕获的 lambda 强制转换为 C 样式函数指针是合法的,但您的 lambda 作用域仅限于对c_set_callback
的调用。
我的方法是在程序的开头调用一次c_set_callback
,并使用静态 C 函数作为参数。该函数在内部调用静态std::function<void()>
,然后set_callback
只更改静态std::function<void()>
。
类似的东西
#include <functional>
std::function<void()> local_callback;
extern "C" void callback_wrapper(void *) {
local_callback();
}
template<typename Function>
void set_callback(Function&& function) {
local_callback = std::forward<Function>(function);
}
int main() {
c_set_callback(&callback_wrapper, nullptr);
// ...
}
相关文章:
- 在c++类上调用void函数
- C++为什么尽管我调用了void函数,它却不起作用
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 使用运算符调用 void 函数时出错<set>
- C++命名空间中调用 void 函数的错误
- 在数组函数指针中调用void
- c++ 检查 Unix 中是否存在目录,如果存在,则调用 void 函数
- 在 main() 之前调用 void 函数
- C 如何在没有错误的情况下调用void函数
- 如何使用数组和参考参数调用void函数
- 如何在C++中调用void foo(int (&)[]) {}?
- 如何从主调用 void 函数
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- 调用void函数
- 如果没有返回,如何向main调用void函数
- 在什么情况下afx_msg可以调用 void OnDestroy( ) 又名 CWnd:OnDestroy()
- 如何在 cout 语句中调用 void 函数
- C++ 错误:使用 argc、*argv[] 和多维数组调用 void 函数时"no matching function to call to "
- c++ 14是否要求delete表达式必须调用' void operator::delete(void*, std::
- 将无符号char*缓冲区强制转换为可接受参数的可调用void指针