C++允许重载函数调用运算符,写作operator()。如果在自定义的类中编写一个operator(),那么这个类的对象就可以当成函数指针使用。包含函数调用运算符的类对象成为函数对象,或简称为仿函数。只能将这个运算符重载为类的非静态方法。
下面是一个简单的类,它带有一个重载的operator()以及一个具有相同行为的类方法:
class FuncO {
public:
FuncO operator () (int param); // Function call operator
int doSquare (int param);
};
// Impelementation of overloaded function call operator
FuncO FuncO::operator () (int param) {
cout << doSquare (param) << endl;
return FuncO (*this);
}
// Implementation of nomal method
int FuncO::doSquare (int param) {
return param * param;
}
int main ()
{
FuncO square;
square (2) (3) (4);
cout << square.doSquare(5) <<endl;
}
这个代码示例里重载的函数调用运算符比较有趣,它的返回类型是一个FuncO对象,这个对象也是函数对象,也可以直接当成函数指针来使用,所以我们看到下面在出现了square (2) (3) (4),连续调用了3次,第一次square (2) 返回了一个函数对象,接着这个函数对象调用square (2)(3),然后又返回一个函数对象,接着调用square (2) (3) (4)。
运行结果如下:
$ ./FuncO
4
9
16
25
这个例子在VTM代码中的参数解析中有用到。
《重载函数调用运算符》有一个想法