我正在尝试将成员函数指针传递给c样式函数(因为它在C语言中是lib)
它想要的指针定义为:
void (*)(int, const char*)
所以我想传递的函数是:
void Application::onError(int error, const char *description)
我正在尝试通过以下代码传递它:
setCallback(bind(&Game::onError, this, placeholders::_1, placeholders::_2));
这给了我以下错误:
cannot convert ‘std::_Bind_helper<false, void (Application::*)(Application*, int,
const char*), Application* const, const std::_Placeholder<1>&, const
std::_Placeholder<2>&>::type {aka std::_Bind<std::_Mem_fn<void (Application::*)
(Application*, int, const char*)>(Application*, std::_Placeholder<1>,
std::_Placeholder<2>)>}’ to ‘GLFWerrorfun {aka void (*)(int, const char*)}’ for
argument ‘1’ to ‘void (* glfwSetErrorCallback(GLFWerrorfun))(int, const char*)’
glfwSetErrorCallback(bind(&Application::onError, this, placeholders::_1, placeholders::_2));
有什么方法可以成功地将成员函数作为绑定函数传递给c样式函数?
结果std::bind
是一个复杂的C ++对象。例如,它必须存储所有绑定的参数。因此,它绝对不能转换为函数指针。
您正在处理的回调规范显然不允许“用户数据”有效负载,因此没有地方可以隐藏指向可用于调用非静态成员函数的C ++对象的指针。这意味着您将必须调用全局或静态成员函数,或诉诸于全局/静态成员/每个线程变量来存储对象指针。
唯一100%可移植的方法是创建一个C链接函数用作回调。这样做,并使用全局对象指针来调用原始对象onError()
:
Application *error_handling_application;
extern "C" void errorCallback(int error, const char *description)
{
error_handling_application->onError(error, description);
}
请注意,您经常会遇到使用静态成员函数代替my的程序errorCallback
。这适用于大多数平台上的大多数编译器,但不能保证能正常工作。C库期望具有C语言链接的功能。静态成员函数只能具有C ++语言链接。C函数和C ++函数的调用机制可能会有所不同(取决于ABI),这将导致对传入的静态成员函数的调用格式错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句