operator()的含义是什么?

4
在C ++中,operator()的含义是什么?我看到它经常用于“函数对象”或函数比较器等功能。那么这样的函数如何调用?在其他情况下有用吗?对于这样的运算符,我可以声明多少个参数?例如,以下是可以接受的吗?
bool operator() (Foo f, Baz b, Quz q, Oik o) {...}
5个回答

5
假设您有一个函数对象类 Func,并且定义了 operator()。如果您有该类的实例,只需在引用该实例的表达式后面加括号即可:
Func myFunc;
myFunc(); // Calls the operator() member function

作为标准库的一个示例,我们可以看一下二元函数对象std::less:
std::less<int> myLess; // Create an instance of the function object
std::cout << myLess(5, 6) << std::endl; // Is 5 less than 6?
operator()的另一个常见用途是创建矩阵类时使用。您可以定义T& Matrix::operator()(int,int)以从矩阵中检索元素,例如myMatrix(1,2)operator()可接受的参数数量与其他函数相同。不过这是由具体实现决定的。标准建议您的实现应至少允许256个参数(在附录B中给出)。 operator()的查找在标准中有定义(ISO/IEC 14882:2003 §13.3.1.1.2),如下所示:
如果函数调用语法中的主表达式E在求值时得到了类型为"cv T"的类对象,则候选函数集合包括T的函数调用运算符。T的函数调用运算符是通过在上下文(E).operator()中对名称operator()进行普通查找而获得的。
简单来说,如果您使用expression()语法进行函数调用,并且括号前的表达式求值结果是一个类的实例,则会将该类的operator()成员函数添加到可能被调用的候选函数列表中。

3

我没有看到提到的一点是,尽管在语法上,它的调用方式与常规的非成员函数(我敢说是C风格的)非常相似。一个区别是,由于函数对象是类/结构的实例,它可以有一个关联状态。

对于非成员函数,这通常意味着静态局部变量(经常不是维护状态的最佳或最有用的方法)或全局变量(通常不希望)。而函数对象与C++对封装的概念紧密结合,其中状态/数据与操作它的函数密切相关。

一个有启示性的例子是:

//Declaration
struct instructive_example
{
  instructive_example()
: _invocation_count(0) {};

  uint get_invocation_count() const
  { return _invocation_count; }

  void operator()()
  {
    //Do something

    //And/or operate on the state associated with this function object
    //In this case it is a simple increment of _invocation_count
    ++_invocation_count;
  }
private:
  uint _invocation_count;
};

//Instantiation & invocation:
instructive_example eg;

eg();

3

1

像任何重载运算符一样,operator()是一个函数的奇怪名称。它必须是类或结构体的成员函数,但除了所有函数的通常规则之外,对其参数没有限制。

x的类型为类类型时,为了评估表达式x(args),C++将尝试调用x.operator()(args),其中args可以是空字符串或任意数量的函数参数。


0

这只是一个普通的函数,当您将函数调用语法应用于用户定义的类型时,它会被调用。

因此,它具有常规成员函数的所有限制和特性。它可以是模板,可以接受任意数量的参数,需要返回类型,可以是const等。


我几乎不会把运算符重载称为“普通函数”!(不过,我明白你的意思 :P) - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接