operator()的典型用法是什么

时间:2011-05-18 18:18:59

标签: c++ operator-overloading

  

可能重复:
  How can overloading operator “function call” in C++ be useful?

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

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

4 个答案:

答案 0 :(得分:3)

它大量用于STL的哈希,集合和算法组件来构造称为“仿函数”的东西。例如:

using stl::map ;

map<string, string> myMap ;

但是如果你看一下map的规范,它还包括一个'Compare'条目,默认为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'时,你可以通过使用不同的仿函数来排序以相反的顺序产生项目。

答案 1 :(得分:2)

请参阅此链接中的示例以查看用例:STL functional

答案 2 :(得分:0)

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

这些对象通常被称为“仿函数”,但不应与数学中的同一术语混淆。我认为一个更恰当的术语是“功能对象”。

想象一下,你有一个需要回调的函数。但是假设你需要在回调中存储一些状态。

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

void DoStuffAndCallBack(MyCallbackType Callback)
{
    ...
    Callback(args)
    ...
}

在C或“C-with-classes”风格的C ++中,您可以将静态回调函数传递给此方法,并将结果存储在某个全局或类静态变量中。

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

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

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

换句话说,这是一种避免全局变量的好方法(:

我确信还有其他用途,但这是一个好的,IMO。

答案 3 :(得分:-2)

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

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

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