class gfx {
void resize(int x, int y);
}
gfx g;
我能以某种方式将g.resize转换为'void(*)(int,int)'吗?
答案 0 :(得分:6)
没有。 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中找到它们。)
答案 1 :(得分:0)
是的,你可以这样做:
void easy_resize(int x, int y) { g.resize(x, y); }