class A {
public:
int f();
int (A::*x)(); // <- declare by saying what class it is a pointer to
};
int A::f() {
return 1;
}
int main() {
A a;
a.x = &A::f; // use the :: syntax
printf("%d\n",(a.*(a.x))()); // use together with an object of its class
}
8条答案
按热度按时间fjaof16o1#
语法错误。成员指针与普通指针属于不同的类型类别。成员指针必须与其所属类的对象一起使用:
a.x
还没有说明要在哪个对象上调用函数。它只是说明要使用存储在对象a
中的指针。另一次将a
作为.*
运算符的左操作数前置,将告诉编译器要在哪个对象上调用函数。ztigrdn82#
int (*x)()
不是指向成员函数的指针。指向成员函数的指针如下所示:int (A::*x)(void) = &A::f;
.8ulbf1ek3#
Call member function on string command
注意
(this->*func)();
以及使用类名void (A::*func)()
声明函数指针的方式neskvpey4#
需要使用指向成员函数的指针,而不仅仅是指向函数的指针。
k4ymrczo5#
遗憾的是,您无法将现有的成员函数指针转换为普通函数指针,但您可以用一种非常简单的方式创建适配器函数模板,将编译时已知的成员函数指针 Package 在普通函数中,如下所示:
注意,为了调用成员函数,必须提供
A
的示例。nwlqm0z16#
虽然这是基于本页其他地方的优秀答案,但我有一个用例没有完全被他们解决;对于指向函数的指针向量,请执行以下操作:
如果你正在编写一个带有索引函数的命令解释器,需要与参数语法和帮助提示等结合起来,这样的东西是有用的。
yhqotfr87#
基于@IlldanS4的答案,我创建了一个模板类,它允许任何具有预定义参数和类示例的成员函数通过引用传递,以便以后调用。
试验/示例:
显然,只有当给定的参数和所有者类仍然有效时,这才能起作用。至于可读性...请原谅我。
**编辑:**通过使元组正常存储,删除了不必要的malloc。为引用添加了继承类型。添加了在调用时提供所有参数的选项。现在正在处理两者....
**编辑2:**正如承诺的那样,两者都有。唯一的限制(我看到的)是预定义的参数必须在回调函数中运行时提供的参数之前。感谢@Chipster在gcc兼容性方面提供的一些帮助。这在ubuntu上的gcc和windows上的visual studio上都有效。
**编辑3:**clang遵从性、更大的灵活性和示例。(摘自我的业余爱好项目,我计划最终将其开源。)
在写这篇文章的时候,我遇到了libstdc++ known bug #71096,当回调构造时参数〉1时,libstdc++ known bug #71096会破坏
std::get
,这个bug在gcc 11中已经被标记为修复,不幸的是,这个bug目前还没有进入ubuntu repo(apt说我已经更新到9.3.0了)kpbpu0088#
@Johannes Schaub - litb有正确的解决方案,但我认为发布一个使用指向成员函数的指针的通用示例也会很有益。
C++17有a template function用于调用指向成员函数的指针,如下所示。