可能重复:
How can overloading operator “function call” in C++ be useful?
我经常看到括号运算符operator()
在类或结构上重载的位置。我自己从未遇到过这样的需求,并想知道这个运营商的典型用途/需求是什么?
例如,重载operator==
被接受为基于与提供的参数的某些相等性返回true或false。这有一定的接受和预期的行为。
答案 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,代码将按写入的方式工作。它创建了一个仿函数,允许像函数一样调用类的实例。