C++ 仿函数深度解析:状态管理与 STL 实践
在 C++ 里,仿函数(Functor) 指的是重载了 operator() 的类或结构体实例。它们的行为和普通函数几乎一致,却能像函数那样被调用。这个概念在 STL 算法、回调机制以及函数适配器里非常常见。下面结合具体场景,聊聊它的核心用法和优势。
为什么需要仿函数?
虽然普通函数或 C++11 引入的 std::function 也能满足可调用需求,但仿函数有独特的优势:
- 状态保持:普通函数是静态的,无法保存上下文;仿函数可以在成员变量里维护状态,比如计数器或阈值。
- 性能考量:作为类的实例,编译器更容易对仿函数进行内联优化,减少调用开销。
- STL 兼容性:很多 STL 算法(如
std::sort)默认就接受仿函数作为自定义规则。
基本用法:重载 operator()
定义仿函数的关键是在类或结构体里重载 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;
}
这里 Add 对象 add 通过 operator() 变成了可调用对象,写法上完全等同于函数调用 add(3, 5)。参数和返回值类型由你定义,灵活性很高。
带状态的仿函数
仿函数最迷人的地方在于它能'记住'之前的调用。比如统计调用次数:
#include <iostream>
class Counter {
private:
int count;
public:
Counter() : () {}
{
count++;
count * value;
}
{
count;
}
};
{
Counter counter;
std::cout << () << std::endl;
std::cout << () << std::endl;
std::cout << << counter.() << std::endl;
;
}


