class Demo
{
public:
// 定义指针类型, 指向Demo类成员方法的函数指针
typedef int (Demo::* FuncType)(const int a, const int b);
// 定义一些成员函数
int Add(const int a, const int b)
{
return a + b;
}
int Mul(const int a, const int b)
{
return a * b;
}
// 选择上面一个成员函数
void SelectMethod(FuncType func)
{
compute_ = func;
}
// 根据选择的成员函数计算
int Compute(const int a, const int b)
{
return (this->*compute_)(a, b);
}
private:
FuncType compute_;
};
int main (int argc, char **argv)
{
Demo demo;
demo.SelectMethod(&Demo::Add);
cout << demo.Compute(100, 200) << endl;
demo.SelectMethod(&Demo::Mul);
cout << demo.Compute(100, 200) << endl;
return 0;
}
//output:
// 300
// 20000
如上述代码, 定义了一个指向类 Demo:: 的函数指针 FuncType, 其完整的类型为
int (Demo::* )(const int a, const int b);
所以调用的时候应当使用 object.* 或 object->* 的方式来访问 FuncType 的类型
(this->* compute_) // equal to: this->Add
(this->* compute_)(a, b) // equal to: this->Add(a, b)
//or
Demo demo;
(demo.*compute_) // equal to: demo.Add
(demo.*compute_)(a, b) // equal to: demo.Add(a, b)