前言
在 C++ 中,仿函数(Functor) 是指重载了 operator() 的类或结构体的对象,它们的行为类似于普通函数,因此可以像函数一样被调用。仿函数在 STL 算法、回调机制、函数适配器等场景中有着广泛的应用。
1. 为什么需要仿函数?
在 C++ 中,我们可以用普通函数或 std::function(C++11 引入)来定义可调用对象,但仿函数相比之下有以下优势:
- 状态存储:普通函数无法存储状态,而仿函数可以在对象内部维护状态,例如计数器、阈值等。
- 性能优化:由于仿函数是类的实例,可以通过内联优化减少函数调用的开销。
- 与 STL 兼容:STL 容器和算法广泛使用仿函数,如
std::sort()可接受仿函数作为自定义排序规则。
2. 仿函数的基本用法
要定义一个仿函数,需要在类或结构体中重载 operator(),示例如下:
#include <iostream>
struct Add {
int operator()(int a, int b) {
return a + b;
}
};
int main() {
Add add;
std::cout << "3 + 5 = " << add(3, 5) << std::endl;
return 0;
}
解析
operator()使Add对象add变成可调用对象,类似于普通函数add(3, 5)。operator()可以接受参数,并返回计算结果。
3. 具有状态的仿函数
仿函数可以存储状态,使其在多个调用间保持数据。例如,创建一个计算调用次数的仿函数:
#include <iostream>
class Counter {
private:
count;
:
() : () {}
{
count++;
count * value;
}
{
count;
}
};
{
Counter counter;
std::cout << () << std::endl;
std::cout << () << std::endl;
std::cout << << counter.() << std::endl;
;
}


