运算符()的典型用途是什么

What is the typical use for operator()

本文关键字:是什么 典型 运算符      更新时间:2023-10-16

可能的重复项:
重载运算符"函数调用"C++有什么用?

我经常看到括号运算符 operator() 在类或结构上重载的位置。我自己从未遇到过这样的需求,想知道这个运营商的典型用途/需求是什么?

例如,重载operator==被接受为基于与提供的参数达成的某种相等性返回 true 或 false。这具有某种接受和预期的行为。

它被大量用于STL的哈希,集合和算法组件,以构造称为"函子"的东西。 例如:

using stl::map ;
map<string, string> myMap ;

但是,如果您查看地图的规范,它还包括一个默认为less的"比较"条目。 比较是您希望映射在比较两个键时使用的"函子"。 它看起来像这样:

template<class Key>
class less<Key> {
public:
  boolean operator()(const Key& a, const Key& b) { return a < b ;}
} ;

所以你拥有的是:

 map<string, string, less<string> > myMap ;

每次你在地图中放置一些东西或尝试在地图上找到一些东西时,它都会使用 less::operator() 进行比较。

您可以使用

它来实现其他效果,例如在使用"sort"时,您可以使用不同的函子以相反的顺序生成项目。

您可以使用 operator(),也称为"函数调用运算符",使对象的行为类似于函数(并可用作函数)。

这些对象通常被称为"函子",但这不应该与数学中的同一术语混淆。我认为一个更合适的术语是"函数对象"。

假设你有一个接受回调的函数。但是假设您需要在该回调中存储一些状态。

[注意:我没有编译过这段代码,但你明白了]

void DoStuffAndCallBack(MyCallbackType Callback)
{
    ...
    Callback(args)
    ...
}
在 C 或

"C-with-classes"样式C++中,您将向此方法传递静态回调函数,并将结果存储在某个全局或类静态变量中。

但在C++中,该函数可以这样编写:

template<CallbackType>
void DoStuffAndCallBack(CallbackType Callback)
{
    ...
    Callback(args)
    ...
}

现在,您可以定义一个重载operator()的函子对象,并将该对象的实例传递给函数。该实例将获得回调,并且要存储的任何中间结果都可以存储在该实例中。

换句话说,这是避免全局变量(:

我敢肯定还有其他用途,但这是一个好的用途,IMO。

规范示例是智能指针类返回它是否为 null,因此您可以执行以下操作:

SmartPointer p = someOtherThing;
if (p) 
{ 
// do something 
}

在这种情况下,() 运算符的返回类型应为 bool,并且代码将按编写的方式工作。它创建一个函子,允许像函数一样调用类的实例。