运算符()的典型用途是什么
What is the typical use for operator()
可能的重复项:
重载运算符"函数调用"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,并且代码将按编写的方式工作。它创建一个函子,允许像函数一样调用类的实例。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- iterator_trait的典型用例是什么?
- 反向代理的典型架构是什么?
- 运算符()的典型用途是什么