获取函数ptr到instanced类的成员函数?

时间:2010-12-27 23:52:36

标签: c++ function-pointers member-function-pointers

class gfx { 
    void resize(int x, int y);
}

gfx g;    

我能以某种方式将g.resize转换为'void(*)(int,int)'吗?

2 个答案:

答案 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::functionstd::bind工具(您也可以在Boost和C ++ TR1中找到它们。)

答案 1 :(得分:0)

是的,你可以这样做:

void easy_resize(int x, int y) { g.resize(x, y); }