重载函数调用运算符

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代码中的参数解析中有用到。

《重载函数调用运算符》有一个想法

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注