3 c++ member-function-pointers function-pointers
class gfx {
void resize(int x, int y);
}
gfx g;
Run Code Online (Sandbox Code Playgroud)
我能以某种方式将g.resize转换为'void(*)(int,int)'吗?
号码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);
}
Run Code Online (Sandbox Code Playgroud)
此非成员resize函数具有类型void(*)(gfx*, int, int),可以作为非成员函数调用.这种方法的一般形式是C++ 0x中的设备std::function和std::bind设备(你也可以在Boost和C++ TR1中找到它们).