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)[注意:非静态成员函数的类型是普通函数类型,非静态数据成员的类型是普通对象类型.没有特殊的成员函数类型或数据成员类型.]
非静态成员函数不是普通函数.你不能形成对它们的自由指针.
引用非静态成员函数的唯一允许方式是通过一对实例指针/引用和指向成员函数的指针:
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 *);,但是没有指定.)
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |