C++ 中 operator() 重载详解
1. operator() 重载基础概念
1.1 函数对象定义
- 函数对象(Functor):重载了 operator()的类实例,可以像函数一样被调用
- 语法格式:
ReturnType operator()(ParameterList) const - 灵活性:支持多种参数列表的重载版本
1.2 基础示例
classAdder{public:intoperator()(int a,int b)const{return a + b;}};// 调用示例 Adder adder;int result =adder(5,3);// 等价于 adder.operator()(5, 3)
2. 状态保持的函数对象
2.1 计数器实现
classCounter{private:int count;int step;public:Counter(int initial =0,int increment =1):count(initial),step(increment){}// 无参数调用,返回当前值并递增intoperator()(){int current = count; count += step;return current;}// 重置计数器voidoperator()(int value){ count = value;}// 重载带步长的调用intoperator()(int start,int increment){ count = start; step = increment;returnoperator()();// 调用无参版本}};// 调用示例 Counter counter(0,1);int val1 =counter();// 返回 0,count 变为 1int val2 =counter();// 返回 1,count 变为 2counter(10);// 重置为 10int val3 =counter(100,5);// 重置为 100,步长为5,返回100
2.2 累加器实现
classAccumulator{private:int sum;public:Accumulator(int initial =0):sum(initial){}intoperator()(int value){ sum += value;return sum;}voidoperator()(int value,bool reset){if(reset) sum =0; sum += value;}};// 调用示例 Accumulator acc(0);int result1 =acc(5);// sum = 5int result2 =acc(3);// sum = 8acc(10,true);// 重置后累加,sum = 10
3. 比较器函数对象
3.1 字符串长度比较器
classStringLengthComparator{public:booloperator()(const std::string& a,const std::string& b)const{return a.length()< b.length();}};// 调用示例 std::vector<std::string> strings ={"apple","banana","cherry","date"}; std::sort(strings.begin(), strings.end(),StringLengthComparator());
3.2 数值比较器
classNumberComparator{private:bool ascending;public:NumberComparator(bool asc =true):ascending(asc){}booloperator()(int a,int b)const{return ascending ? a < b : a > b;}};// 调用示例 std::vector<int> numbers ={5,2,8,1,9}; std::sort(numbers.begin(), numbers.end(),NumberComparator(true));// 升序 std::sort(numbers.begin(), numbers.end(),NumberComparator(false));// 降序
4. 算法库中的应用
4.1 自定义谓词函数对象
classGreaterThan{private:int threshold;public:GreaterThan(int t):threshold(t){}booloperator()(int value)const{return value > threshold;}};// 调用示例 std::vector<int> numbers ={1,5,3,8,2,9};int count = std::count_if(numbers.begin(), numbers.end(),GreaterThan(5));// count = 2 (8, 9)
4.2 变换函数对象
classSquare{public:intoperator()(int x)const{return x * x;}};classAddConstant{private:int constant;public:AddConstant(int c):constant(c){}intoperator()(int x)const{return x + constant;}};// 调用示例 std::vector<int> input ={1,2,3,4,5}; std::vector<int>output(input.size());// 使用 Square std::transform(input.begin(), input.end(), output.begin(),Square());// output = {1, 4, 9, 16, 25}// 使用 AddConstant std::transform(input.begin(), input.end(), output.begin(),AddConstant(10));// output = {11, 12, 13, 14, 15}
5. 函数对象容器
5.1 操作器容器
classOperationContainer{private: std::string operation;public:OperationContainer(const std::string& op):operation(op){}intoperator()(int a,int b)const{if(operation =="add")return a + b;if(operation =="sub")return a - b;if(operation =="mul")return a * b;if(operation =="div")return b !=0? a / b :0;return0;}};// 调用示例 OperationContainer addOp("add"); OperationContainer mulOp("mul");int result1 =addOp(5,3);// 返回 8int result2 =mulOp(5,3);// 返回 15
5.2 条件过滤器
classFilter{private: std::function<bool(int)> condition;public:Filter(std::function<bool(int)> cond):condition(cond){} std::vector<int>operator()(const std::vector<int>& input)const{ std::vector<int> result;for(int value : input){if(condition(value)){ result.push_back(value);}}return result;}};// 调用示例 std::vector<int> numbers ={1,2,3,4,5,6,7,8,9,10};// 过滤偶数 Filter evenFilter([](int x){return x %2==0;});auto evenNumbers =evenFilter(numbers);// {2, 4, 6, 8, 10}// 过滤大于5的数 Filter greaterFilter([](int x){return x >5;});auto greaterNumbers =greaterFilter(numbers);// {6, 7, 8, 9, 10}
6. 高级应用场景
6.1 闭包模拟
classClosure{private:int capture_value;public:Closure(int val):capture_value(val){}intoperator()(int x)const{return x + capture_value;}intoperator()(int x,int y)const{return x * y + capture_value;}};// 调用示例 Closure closure(10);int result1 =closure(5);// 返回 15 (5 + 10)int result2 =closure(3,4);// 返回 22 (3 * 4 + 10)
6.2 函数组合器
template<typenameF,typenameG>classCompose{private: F f; G g;public:Compose(F f_func, G g_func):f(f_func),g(g_func){}template<typenameT>autooperator()(T x)const->decltype(f(g(x))){returnf(g(x));}};// 调用示例auto square =[](int x){return x * x;};auto increment =[](int x){return x +1;}; Compose<decltype(square),decltype(increment)>compose(square, increment);int result =compose(5);// 先执行 increment(5) = 6, 再执行 square(6) = 36
7. 性能考虑与最佳实践
7.1 const 修饰符使用
classStatelessFunction{public:// 无状态函数对象应使用 const 修饰intoperator()(int x)const{return x *2;}};
7.2 引用参数传递
classStringProcessor{public: std::string operator()(const std::string& input)const{// 使用 const 引用避免拷贝return input +"_processed";}};
8. 总结
- 灵活性:operator()重载提供了函数对象的灵活性
- 状态保持:函数对象可以维护内部状态
- 算法兼容:与 STL 算法完美配合
- 性能优势:编译时优化,避免函数指针调用开销
- 类型安全:编译时类型检查,避免运行时错误