operator->*是一个二元运算符,其行为与所有其他二元运算符类似
operator->*,指向成员的指针间接引用运算符通常同某种代表 灵巧指针 的
对象一起使用
operator()的函数调用必须是成员函数,它是唯一的允许在它里面有任意个
参数的函数
要想创建一个operator->*,必须首先创建带有operator()类,这是operator->*
将返回对象的类
FunctionObject的构造函数得到并储存指向对象的指针和指向成员函数的指针,
然后operator()使用这些指针进行实际指向成员的指针的调用
//: C12:PointerToMemberOperator.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
#include <iostream>
using namespace std;
class Dog {
public:
int run(int i) const {
cout << "run\n";
return i;
}
int eat(int i) const {
cout << "eat\n";
return i;
}
int sleep(int i) const {
cout << "ZZZ\n";
return i;
}
typedef int (Dog::*PMF)(int) const;
// operator->* must return an object
// that has an operator():
class FunctionObject {
Dog* ptr;
PMF pmem;
public:
// Save the object pointer and member pointer
FunctionObject(Dog* wp, PMF pmf)
: ptr(wp), pmem(pmf) {
cout << "FunctionObject constructor\n";
}
// Make the call using the object pointer
// and member pointer
int operator()(int i) const {
cout << "FunctionObject::operator()\n";
return (ptr->*pmem)(i); // Make the call
}
};
FunctionObject operator->*(PMF pmf) {
cout << "operator->*" << endl;
return FunctionObject(this, pmf);
}
};
int main() {
Dog w;
Dog::PMF pmf = &Dog::run;
cout << (w->*pmf)(1) << endl;
pmf = &Dog::sleep;
cout << (w->*pmf)(2) << endl;
pmf = &Dog::eat;
cout << (w->*pmf)(3) << endl;
getchar();
} ///:~
Dog有三个成员函数,它们的参数和返回类型但是int
operator->*创建并返回一个FunctionObject对象
operator->操作的内容正插入到调用operator->*的中间
执行的operator->*机制仅作用于参数和返回值是int的成员函数
输出
operator->*
FunctionObject constructor
FunctionObject::operator()
run
1
operator->*
FunctionObject constructor
FunctionObject::operator()
ZZZ
2
operator->*
FunctionObject constructor
FunctionObject::operator()
eat
3