获取函数 ptr 到实例类的成员函数?
Posted
技术标签:
【中文标题】获取函数 ptr 到实例类的成员函数?【英文标题】:get function ptr to member function of instanced class? 【发布时间】:2010-12-27 23:52:35 【问题描述】:class gfx
void resize(int x, int y);
gfx g;
我能以某种方式将 g.resize 转换为 'void (*)(int, int)' 吗?
【问题讨论】:
如果你解释你想要做什么,也许我们可以建议一些可行的替代方案。 将 GLFW 中的调整大小回调包装到我的图形类中 【参考方案1】:没有。 gfx::resize
的类型为 void(gfx::*)(int, int)
。您无法将其有意义地转换为 void(*)(int, int)
类型,因为您只能将其作为 gfx
类型的对象的成员函数来调用。
成员函数只能在类的实例上调用,所以给定你的gfx g;
,你可以调用g.resize()
,但你不能像普通函数一样调用resize()
。普通函数指针不能指向成员函数,因为它无法将函数调用绑定到类的实例。
从概念上讲,成员函数接受一个附加参数,this
参数,它指向调用它的类的实例。
如果您希望能够通过普通函数指针调用成员函数,您可以创建一个带有参数的非成员函数(或静态成员函数)包装器,您可以将对象实例传递给调用成员函数。例如,您可以:
void resize(gfx* obj, int x, int y)
return obj->resize(x, y);
这个非成员resize
函数的类型为void(*)(gfx*, int, int)
,可以作为非成员函数调用。这种方法的通用形式是 C++0x 中的 std::function
和 std::bind
工具(您也可以在 Boost 和 C++ TR1 中找到它们)。
【讨论】:
void(*)(int, int)
没有 this
指针。您必须指定要针对哪个类型/实例运行它,因此签名也必须更改。
@Merlyn:这不是我说的吗?
是的。过去,我没有得到那个“成员函数”带有一个“this”指针。我花了一些时间阅读了关于 this
的明确教程,我才理解了这一点。顺便说一句,我确实投了赞成票。
@Merlyn:啊;谢谢你。我有时很难“像初学者一样”思考,您指出这一点很有帮助。【参考方案2】:
是的,你可以做到:
void easy_resize(int x, int y) g.resize(x, y);
【讨论】:
这就是我目前的做法。但我必须跟踪指向我的图形类的指针,这似乎有点 hacky 你需要图形类做什么?有必要把它变成一个类吗?有时只拥有函数(不是类的成员函数)是一个不错的选择。以上是关于获取函数 ptr 到实例类的成员函数?的主要内容,如果未能解决你的问题,请参考以下文章