看看下面的例子:
#include <iostream>
using namespace std;
class Test {
public:
int fun1(int x) { return x+1; }
};
typedef int (Test::*PtrType)(int);
void call(Test& self, PtrType prt) {
cout << (self.*ptr)(2) << endl;
}
int main() {
Test t;
call(t, &Test::fun1);
return 0;
}
该行为typedef int (Test::*PtrType)(int);
类方法定义了类型的简单名称。括号(Test::*PtrType)
很重要;PtrType
是新定义的类型(尽管您可以不使用 typedef,并将整个签名放在call
函数参数中,但强烈建议不要使用这种方法)。
该表达式(self.*ptr)(2)
调用您的指针指向的方法ptr
,并将 2 作为其参数传递。同样,关键点是在 . 周围加上括号(self.*ptr)
。
&
最后要记住的一点是,在设置指针 ( ) 的值时不能跳过&Test::fun1
,即使使用常规函数也是如此。
如果您使用模板,您可以使您的代码更整洁:
template <typename PtrT>
void call(Test& self, PtrT ptr) {
cout << (self.*ptr)(2) << endl;
}
在这种情况下不需要 typedef,但是,您仍然必须记住调用中的括号。
如果您使用新的 C++0x 标准进行编译,则可以使用std::function
或std::bind
.