[英]Void* function with a parameter
对于我要编写的应用程序,我需要能够在interface
编写GLEnable(GL_REPEAT)
(完成此工作)。 用户这样做后,系统应使用正确的参数调用该函数。
为此,我使用以下变量来获取正确的功能:
std::map<std::string, void(*)(GLenum)> glEnableDisable;
并通过以下方式在其中存储数据:
glEnableDisable["glEnable"] = glEnable;
glEnableDisable["glDisable"] = glDisable;
(请注意,上面给出了警告“'='无法从'void(__stdcall *)(GLenum)'转换为'void(__cdecl *)(GLenum)'”)
最后,该函数通过以下方式调用:
((void (*)(GLenum)) Main.glEnableDisable[SplittedUp[0]])(Parameter);
现在,我想知道我在做什么错。 我没有参数就可以正常工作,但是我确实需要参数。
提前致谢,
乔伊
更改此:
std::map<std::string, void(*)(GLenum)> glEnableDisable;
对此:
std::map<std::string, std::function<void(GLenum)>> glEnableDisable;
不必担心再次调用约定。 std::function
能够存储任何函数或可调用对象,无论其调用约定是什么。
不需要强制转换:
Main.glEnableDisable[SplittedUp[0]])(Parameter);
问题是“如何在std::map<std::string, void(*)(GLenum)>
一个接受参数的函数指针”? 如果是,则答案是:不可能,因为您声明了具有固定功能指针签名的映射。 代码中的签名表示存储的函数指针不接受任何参数。
如果要存储参数,则有两个选择:
包装函数,该函数访问不在堆栈上的参数,并使用提供的参数调用指定的函数。
为您使用的每个函数指针签名创建一个映射。
提示:幸运的是您的程序没有由于错误的调用约定而崩溃。 建议将调用约定调整为__cdecl
。
明显:
void(*)(GLenum)
不是 GLenum
函数的正确原型。
假定C
调用约定,在Visual Studio中默认为__cdecl
。 但是,您要调用的实际函数使用不同的调用约定,即__stdcall
。
这样的事情应该可以解决这个问题:
typedef void (__stdcall *GLenumFunc)(int, int); // or whatever your params are
//...
std::map<std::string, GLenumFunc> glEnableDisable;
关于什么是调用约定: x86平台上的调用约定
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.