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


