function-pointers 相关问题

函数指针是指向函数的指针,该函数可以存储在变量中。它允许运行时选择运行哪个函数。

Fortran 中 OpenBLAS 子例程的指针

在我的代码中,我想设置指向 OpenBLAS 子例程的指针,以单精度或双精度编译代码。 为此,我定义了两个模块,并为 single(sge...

回答 1 投票 0

C++ 指向非静态成员函数的函数指针

我有 2 个类:MeshInput 和 VoxelGrid。 VoxelGrid 的成员 sdf 是一个函数指针。现在我想将另一个类的非静态函数分配给 sdf。我无法更改签名...

回答 1 投票 0

如何使用void(*FUNC)(void)

我有一个 API,如下所示: ISRInstall(int ISRnum,void(*FUNC)(void)) 然而我的回调函数是 void task(void*)。 API 生产者建议我使用蹦床作为入口。 接下来...

回答 1 投票 0

将函数指针从一个结构传递到另一个结构而不添加依赖项

我有两个结构体Foo和Bar,我想将一个结构体(Foo)的函数回调存储在另一个结构体(Bar)中,这样它们就不知道彼此。 Bar 不知道 Foo 的情况下是否有可能在 Rust 中使用

回答 1 投票 0

C 结构函数指针传递自引用作为参数

我想运行具有自动填充功能的结构指向的函数。 这是我正在研究的部分: #包括 #包括 struct Fra { //Fra...

回答 3 投票 0

函数指针编译不干净

我正在尝试熟悉 C 中的函数指针。我在网上查找并找到了几个这样的例子。但是,当我编译我的程序时(使用 GCC [版本(Debian 12.2.0-14...

回答 1 投票 0

是否可以将一个类的成员函数的指针列表作为调用这些函数的另一个类的成员?

假设我们有一个 A 类,它有几个具有相同函数签名的 setter 函数,如下面的代码。 A级 { void setter1(int 随便) { 设置一些东西; } 无效设置者...

回答 1 投票 0

如何声明带有 NULL 元素块的指针数组

我正在使用函数指针数组,并且我想直接将其与关联的事件 ID 一起使用。 问题是,事件 ID 从 0x10 开始到 0x1C,从 0x90 到 0xA5。 我不想写...

回答 2 投票 0

如何修复按键回调函数和 glfwSetKeyCallback 之间的参数类型不匹配问题?

我创建了一个包含 std::map 的键盘映射的 Camera 类 我创建了一个 Camera 类,其中包含 std::map<int, void(Camera::*)() 的键盘映射,以方便游戏中的键绑定选项和比使用 switch 语句可以完成的更高性能的键操作查找。 我无法使用 glfwSetKeyCallback 函数从键盘映射访问操作功能,并且我一直遇到 keyCallback 函数和 GLFWkeyfun 之间的签名不匹配的情况。 这是Camera课程: class Camera { Camera(); private: void Mouse_Input(); void Joystick_input(); void keyCallBack(GLFWwindow* window, int key, int scancode, int action, int mods); void forward() { position += velocity * Orientation; } void backward() { position -= velocity * Orientation; } void left() {// Left position -= velocity * glm::normalize(glm::cross(Orientation, Up)); } void right() { position += velocity * glm::normalize(glm::cross(Orientation, Up)); } void up() { position += velocity * Up; } void down() { position -= velocity * Up; } void sprint() { velocity *= 2.f; } void noclip() { noClip = !noClip; if (!noClip) { gravity(position, velocity); } } void close() { glfwSetWindowShouldClose(Window::handle, true); } public: alignas(16) glm::mat4 view; alignas(16) glm::mat4 proj; alignas(16) glm::vec3 position; void update(float FOVdeg, float nearPlane, float farPlane); protected: bool noClip = true; bool firstClick = true; float velocity = 0.05f; float sensitivity = 1.75f; glm::vec3 Orientation; glm::vec3 Up; using pfunc = void (Camera::*)(); std::map<int, pfunc> keyboard_map { { GLFW_KEY_W, &Camera::forward }, { GLFW_KEY_A, &Camera::left }, { GLFW_KEY_S, &Camera::backward }, { GLFW_KEY_D, &Camera::right }, { GLFW_KEY_SPACE, &Camera::up }, { GLFW_KEY_LEFT_CONTROL, &Camera::down }, { GLFW_KEY_LEFT_SHIFT, &Camera::sprint }, { GLFW_KEY_V, &Camera::noclip }, { GLFW_KEY_ESCAPE, &Camera::close } }; }; 这些是我的 cpp 文件中的相关函数定义: void Camera::keyCallBack(GLFWwindow* window, int key, int scancode, int action, int mods) { if (!GLFW_PRESS | !GLFW_REPEAT) { return; } auto afunc = keyboard_map[key];//gets camera action function from map (this->*afunc)();//executes action function } void Camera::update(float FOVdeg, float nearPlane, float farPlane) { if (glfwJoystickPresent(GLFW_JOYSTICK_1)) {//Check for joystick std::jthread t_Console([&] { Joystick_input(); }); } std::jthread t_PC([this] { glfwSetKeyCallback(Window::handle, &Camera::keyCallBack); }); //Line causing the error std::jthread t_mouse([&] { Mouse_Input(); }); if (!noClip) { gravity(position, velocity); } view = glm::lookAt(position, position + Orientation, Up); proj = glm::perspective(glm::radians(FOVdeg), (float)GPU::Extent.width / GPU::Extent.height, nearPlane, farPlane); proj[1][1] *= -1; } 我尝试了这个解决方案,它允许我编译程序,但是在调用 auto afunc = keyboard_map[key]; 函数的 keyCallBack 行时,程序崩溃了,但没有产生错误代码。 std::jthread t_test([this]() { glfwSetKeyCallback(Window::handle, [](GLFWwindow* window, int key, int scancode, int action, int mods) { auto* instance = static_cast<Camera*>(glfwGetWindowUserPointer(window)); if (instance) { instance->keyCallBack(window, key, scancode, action, mods); } }); } ); 我完全找不到这个问题的解决方案。有人可以帮助我理解为什么我的原始方法中存在签名不匹配,为什么访问地图会导致我尝试的其他方法崩溃,以及如何让此设置按预期工作? 编辑:错误:“void(Camera::*)(GLFWwindow* window, int key, int scancode, int action, int mods)类型的参数与GLFWkeyfun类型的参数不兼容” 您正在尝试为您的 glfwSetKeyCallback() 回调使用非静态类方法。这是行不通的,因为 glfwSetKeyCallback() 需要一个 C 风格的函数指针。因此,您必须: 使 keyCallBack() 保持静态 从 keyCallBack() 类中完全删除 Camera 并将其设为独立函数 正如您所发现的,使用非捕获 lambda。 无论哪种方式,正如您已经知道的,您都可以使用 glfwSetWindowUserPointer() 将 Camera* 指针存储到 GLWindow 中,然后在回调中使用 glfwGetWindowUserPointer() 返回到 Camera 对象。但是,您显示的代码没有在任何地方调用 glfwSetWindowUserPointer()。

回答 1 投票 0

存储指向具有任何返回类型和任何数字或参数的函数的指针

我正在编写一种名为 Trunk 的自定义 JIT(解释型)编程语言,目前我正在尝试从代码中解析函数并将它们存储在全局名称 -> 函数映射中。但我陷入困境......

回答 1 投票 0

将成员函数 const 和非常量重载传递给 std::function

我试图让函数指针操作变得“更流畅”,但当有两个重载:const 和 non-const 时,我在将成员函数传递给 std::function 时遇到了问题。

回答 2 投票 0

函数中生成的指针变量不能传入函数指针的参数中

主题: 给定一个不超过 5 位的正整数,要求: 找出它有多少位数字; 分别输出每一位数字; 以相反的顺序输出每个数字。例如,如果原来...

回答 2 投票 0

Golang 泛型 - 在传递函数指针时不能使用类型代替相同类型

我是 golang 新手,我正在研究以下结构: 类型标志[T任何]结构{ 默认值接口{} } 其中 T 可以是 int 或 bool 我定义了以下函数: func (f 标志...

回答 1 投票 0

如何在 UML 类图中表示函数/方法类型

是否有标准方法在 UML 类图中表示命名函数类型? 所谓命名函数类型,是指具有特定签名的函数或方法类型(参数、返回类型,可能是

回答 1 投票 0

不使用this调用成员函数指针

我编写了以下类来查找关键字并执行关联的函数。 #包括 #包括 #包括 类示例; typedef std::ma...

回答 1 投票 0

如何将类成员定义为指向另一个成员函数的指针?

我想将函数指针设置为类的成员,该指针是指向同一类中另一个函数的指针。我这样做的原因很复杂。 在这个例子中,我想...

回答 8 投票 0

获取const方法的地址

我希望能够形成一个只知道类本身和方法名称的成员指针类型。不幸的是,我无法在我的类中拥有 const 和非常量方法变体。

回答 1 投票 0

函数指针和参数

我一直在尝试理解 geeksforgeeks 的帖子,但无法理解代码片段。这是以下帖子: https://www.geeksforgeeks.org/returning-a-function-pointer-from-a-

回答 1 投票 0

std::function 的目的是什么以及如何使用它?

我有必要使用 std::function 但我不知道以下语法意味着什么。 std::function f_name = []() { FNAME(); }; 使用 std::function 的目标是什么?难道是……

回答 3 投票 0

如何比较 Go 中的 2 个函数?

例如,我有要比较的函数列表: http://play.golang.org/p/_rCys6rynf 类型 Action func(foo string) 类型处理程序结构 { 采取行动 行动后 } var 路线图[s...

回答 4 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.