当前位置: 首页 > 知识库问答 >
问题:

GLFW lambdas可以接受捕获参数吗?

羊舌子瑜
2023-03-14
glfwSetKeyCallback(window, 
        [this](GLFWwindow* window, int key, int scancode, int action, int mods)
        {
            if(action == GLFW_PRESS)
            {
                 //use a mutex
                 //Modify member variable
            }
        });

不存在从“lambda[]void(GLFWwindow*window,int key,int scancode,int action,int mods)->void”到glfwkeyfun“的适当转换函数

我是漏掉了什么还是这段代码只是无效?

共有1个答案

高泳
2023-03-14

GLFW回调不接受lambdas或函数对象:它们接受普通的旧函数指针。非捕获的λ可以转换为函数指针,但不能转换为捕获的。

但是,通过使用glfwsetuserpointerglfwgetuserpointer可以获得类似的效果。lambda仍然不能捕获,但是您可以恢复this指针。

例如,

struct MyClass {
  GLFWwindow* window;

  MyClass(GLFWwindow* window) : window(window) {
    glfwSetWindowUserPointer(window, static_cast<void*>(this));

    glfwSetKeyCallback(window, 
      [](GLFWwindow* window, int key, int scancode, int action, int mods) {
        auto self = static_cast<MyClass*>(glfwGetWindowUserPointer(window));
        // can access member variables through `self`
      });
  }

  // make sure that either the class will last as long as GLFW will
  // or clean up the user pointer and callbacks in here
  ~MyClass() {
    // clean up
  }

  // don't be able to copy, probably, or bad things will happen
  MyClass(const MyClass&) = delete;
  MyClass& operator=(const MyClass&) = delete;
  // other things...
};
 类似资料:
  • 问题内容: 我知道JavaScript函数可以接受“任意”数量的参数。 但是我想知道实际上有多少个“任何”个数是否有限制? 例如,假设我向提出了一百万个论点。那行得通吗?还是口译员会翻身? 我猜测最大值是(a)特定于实现的(b),因为对象是类似数组的。 我在语言规范中没有看到这一点,但是可能没有连接点。 问题答案: 尽管没有具体限制规范中参数的理论最大数目这些限制是完全依赖于实现的,最有可能,也将

  • 问题内容: 我们已经从软件供应商处收到Java代码。它包含许多没有任何部分的块。他们到处都是。例: 我的问题是:以上做法是否可以接受?如果是这样,什么时候?还是我应该继续删除所有这些“虚假” 和陈述? 对我来说,这看起来像是可怕的练习,但是我对Java的经验不足以肯定。如果您不打算对它们做任何事情,为什么会发现它们呢?在我看来,仅当您确信例外绝对不会有后果并且您不在乎是否发生例外时,您才这样做。但

  • 问题内容: 我有一个被调用两次的方法,并且我想捕获第二个方法调用的参数。 这是我尝试过的: 但是我得到一个例外,因为Mockito认为应该只调用一次。 如何验证第二个调用的参数? 问题答案: 我认为应该 来自嘲笑javadoc的示例:

  • 问题内容: 是否可以用来捕获任意一组可选参数? 例如,以下两个都应被接受为输入: 先验的 我不知道会指定哪些可选参数,但是会相应地处理它们。 问题答案: 这是一种黑客手段,但效果很好: 检查未添加的参数并添加它们 例如: 那么结果将是

  • 问题 你想构造一个可接受任意数量参数的函数。 解决方案 为了能让一个函数接受任意数量的位置参数,可以使用一个*参数。例如: def avg(first, *rest): return (first + sum(rest)) / (1 + len(rest)) # Sample use avg(1, 2) # 1.5 avg(1, 2, 3, 4) # 2.5 在这个例子中,rest是由所

  • 问题内容: 为什么不能将表名传递给准备好的PDO语句? 还有另一种安全的方法可以将表名插入SQL查询吗?有了安全,我的意思是我不想做 问题答案: 表名和列名不能用PDO中的参数替换。 在这种情况下,您只需要手动过滤和清理数据。一种实现方法是将简写参数传递给将动态执行查询的函数,然后使用一条语句创建要用于表名或列名的有效值白名单。这样,就不会有用户输入直接进入查询。因此,例如: 通过不保留默认大小写