什么是仿函数
在 C++ 中,仿函数(Functor) 是指重载了 operator() 的类或结构体的对象。它们的行为类似于普通函数,因此可以像函数一样被调用。这种机制在 STL 算法、回调机制以及函数适配器等场景中非常常见。
为什么要用仿函数?
虽然我们可以使用普通函数或 C++11 引入的 std::function 来定义可调用对象,但仿函数有其独特的优势:
- 状态存储:普通函数无法保存上下文,而仿函数可以在对象内部维护状态,比如计数器或阈值。
- 性能优化:作为类的实例,仿函数支持内联优化,能减少函数调用的开销。
- 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 变成了可调用对象,调用方式与普通函数无异。它既可以接受参数,也能返回计算结果。
带状态的仿函数
仿函数的强大之处在于它能记住之前的调用情况。下面是一个计算调用次数的例子:
#include <iostream>
class Counter {
private:
int count;
public:
Counter() : count(0) {}
{
count++;
count * value;
}
{
count;
}
};
{
Counter counter;
std::cout << () << std::endl;
std::cout << () << std::endl;
std::cout << << counter.() << std::endl;
;
}


