指向班级成员的指针

use*_*214 2 c++ function-pointers

在我的班上,如果我想指向一个班级成员,

struct S
{
     static int get();
     int do_something();
     int x;
};
Run Code Online (Sandbox Code Playgroud)

我做,

int (*p)() = S::get;
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不适用于非静态成员

int (*p)() = S::do_something; // error
Run Code Online (Sandbox Code Playgroud)

因为,静态成员函数是一个普通的函数,从下面我引用的引用中可以看出非静态成员函数也是一个普通函数,为什么它不起作用呢?这是什么意思?

(9.2/10)[注意:非静态成员函数的类型是普通函数类型,非静态数据成员的类型是普通对象类型.没有特殊的成员函数类型或数据成员类型.]

Ker*_* SB 5

非静态成员函数不是普通函数.你不能形成对它们的自由指针.

引用非静态成员函数的唯一允许方式是通过一实例指针/引用和指向成员函数的指针:

S * p = &theobject;
int (S::*ptmf)() = &S::do_something;

return (p->*ptmf)();
Run Code Online (Sandbox Code Playgroud)

不同于成员对象(要能很好地形成自由指针,例如&theobject.x)成员函数比较复杂,因为你需要考虑虚拟功能:如果S是一个多态基类,p是一个指针到基地,do_something()是虚拟的,那么上面的例子应该执行正确的调度类型.一个简单的自由函数指针不能这样做.

(此外,该标准没有规定如何实现成员函数的每个底层实现,因此这个细节永远不会暴露给用户.通常它会是类似的int S_mangled_name_do_something(S *);,但是没有指定.)

以下是我的一些相关答案:#1,#2.