function-pointers 相关问题

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

收到不兼容的指针类型警告,因为函数的返回不是 void* 而是结构指针

这个警告似乎没有必要。 在我的代码中,我有一个函数指针类型 (void*)(*函数指针)(void*数据) 并且有些函数需要这种类型的函数指针作为参数,b...

回答 1 投票 0

如何实现成员方法指针的比较/较少运算符?

从我的阅读中,我了解到可以使用任一运算符来比较 C++ 中的某些指针类型< or std::less. This is useful if, for example, a pointer is used as a key for a std:...

回答 1 投票 0

通过不带参数的指针调用函数[重复]

我想实现一个返回默认值的通用函数,然后通过函数指针使用它来替换具有不同原型的其他函数。 例如: int 替换...

回答 1 投票 0

void* ptr = &func;使用 msvc 进行编译,无需任何诊断,但 gcc 和 clang 都拒绝它

我正在使用 Stanley 的书《C++ Primer》学习 C++。特别是,关于“指针转换”的部分说: 指向任何非常量类型的指针都可以转换为 void* ...

回答 1 投票 0

如何使函数返回指向函数指针数组的指针

在这个后续程序中,我尝试创建一个函数,返回一个指向 4 个函数指针数组的指针,但我不知道它是如何工作的,也不知道如何调用它并接收返回值...

回答 1 投票 0

为什么概念约束不被视为上下文类型信息?

考虑: 无效 f(int); // (1) 无效 f(int, int); // (2) 自动 pf1 = static_cast< void (*)(int) >(f); // 好的,(1) 的地址 自动 pf2 = static_cast< void (*)(int, int) >(f); ...

回答 1 投票 0

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

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