【发布时间】:2020-02-02 00:33:24
【问题描述】:
我正在创建一个 GLFWKeyCallback,由于它非常简单,我决定使用 lambda。这个回调修改了一个成员变量,所以我必须将 this 传递到捕获列表中。到目前为止,我的代码如下所示:
glfwSetKeyCallback(window,
[this](GLFWwindow* window, int key, int scancode, int action, int mods)
{
if(action == GLFW_PRESS)
{
//use a mutex
//Modify member variable
}
});
问题是每当我将 this 传递到捕获列表中时,Visual Studio 2019 都会显示以下错误:
不存在从“lambda [] void (GLFWwindow *window, int key, int scancode, int action, int mods)->void”到 GLFWKeyfun”的合适转换函数
是我遗漏了什么还是这段代码无效?
【问题讨论】:
-
glfwSetKeyCallback不需要 lambda - 它需要一个普通的旧函数指针。无捕获的 lambda 可转换为函数指针;没有捕获的 lambda(没有地方可以存储捕获的数据)。 -
这能回答你的问题吗? Passing C++ method as function pointer。我的回答显示了在调用裸函数的情况下使用成员函数的混乱性质。
-
您可以使用
glfwSetWindowUserPointer给窗口一个用户定义的指针(就像this一样)并使用glfwGetWindowUserPointer从回调中取回它 -
当问题结束时,我刚刚完成了一个演示
glfwSetWindowUserPointer的答案 :( 不过,是的,设置和检索this作为窗口指针是正确的方法。 -
我的回答显示了解决您问题的方法。关键是你需要一个类的实例来改变成员变量。带有捕获的 lambda 永远不会起作用——它是一个动态创建的类,使用函数指针和捕获值作为数据成员。