C 中 operator() 重载详解1. operator() 重载基础概念1.1 函数对象定义函数对象Functor重载了 operator()的类实例可以像函数一样被调用语法格式ReturnType operator()(ParameterList) const灵活性支持多种参数列表的重载版本1.2 基础示例123456789classAdder {public:intoperator()(inta,intb)const{returna b;}};// 调用示例Adder adder;intresult adder(5, 3);// 等价于 adder.operator()(5, 3)2. 状态保持的函数对象2.1 计数器实现1234567891011121314151617181920212223242526272829classCounter {private:intcount;intstep;public:Counter(intinitial 0,intincrement 1) : count(initial), step(increment) {}// 无参数调用返回当前值并递增intoperator()() {intcurrent count;count step;returncurrent;}// 重置计数器voidoperator()(intvalue) {count value;}// 重载带步长的调用intoperator()(intstart,intincrement) {count start;step increment;returnoperator()();// 调用无参版本}};// 调用示例Counter counter(0, 1);intval1 counter();// 返回 0count 变为 1intval2 counter();// 返回 1count 变为 2counter(10);// 重置为 10intval3 counter(100, 5);// 重置为 100步长为5返回1002.2 累加器实现12345678910111213141516171819classAccumulator {private:intsum;public:Accumulator(intinitial 0) : sum(initial) {}intoperator()(intvalue) {sum value;returnsum;}voidoperator()(intvalue,boolreset) {if(reset) sum 0;sum value;}};// 调用示例Accumulator acc(0);intresult1 acc(5);// sum 5intresult2 acc(3);// sum 8acc(10,true);// 重置后累加sum 103. 比较器函数对象3.1 字符串长度比较器123456789classStringLengthComparator {public:booloperator()(conststd::string a,conststd::string b)const{returna.length() b.length();}};// 调用示例std::vectorstd::string strings {apple,banana,cherry,date};std::sort(strings.begin(), strings.end(), StringLengthComparator());3.2 数值比较器12345678910111213classNumberComparator {private:boolascending;public:NumberComparator(boolasc true) : ascending(asc) {}booloperator()(inta,intb)const{returnascending ? a b : a b;}};// 调用示例std::vectorint 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 自定义谓词函数对象12345678910111213classGreaterThan {private:intthreshold;public:GreaterThan(intt) : threshold(t) {}booloperator()(intvalue)const{returnvalue threshold;}};// 调用示例std::vectorint numbers {1, 5, 3, 8, 2, 9};intcount std::count_if(numbers.begin(), numbers.end(), GreaterThan(5));// count 2 (8, 9)4.2 变换函数对象123456789101112131415161718192021222324classSquare {public:intoperator()(intx)const{returnx * x;}};classAddConstant {private:intconstant;public:AddConstant(intc) : constant(c) {}intoperator()(intx)const{returnx constant;}};// 调用示例std::vectorint input {1, 2, 3, 4, 5};std::vectorint output(input.size());// 使用 Squarestd::transform(input.begin(), input.end(), output.begin(), Square());// output {1, 4, 9, 16, 25}// 使用 AddConstantstd::transform(input.begin(), input.end(), output.begin(), AddConstant(10));// output {11, 12, 13, 14, 15}5. 函数对象容器5.1 操作器容器123456789101112131415161718classOperationContainer {private:std::string operation;public:OperationContainer(conststd::string op) : operation(op) {}intoperator()(inta,intb)const{if(operation add)returna b;if(operation sub)returna - b;if(operation mul)returna * b;if(operation div)returnb ! 0 ? a / b : 0;return0;}};// 调用示例OperationContainer addOp(add);OperationContainer mulOp(mul);intresult1 addOp(5, 3);// 返回 8intresult2 mulOp(5, 3);// 返回 155.2 条件过滤器1234567891011121314151617181920212223classFilter {private:std::functionbool(int) condition;public:Filter(std::functionbool(int) cond) : condition(cond) {}std::vectorint operator()(conststd::vectorint input)const{std::vectorint result;for(intvalue : input) {if(condition(value)) {result.push_back(value);}}returnresult;}};// 调用示例std::vectorint numbers {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// 过滤偶数Filter evenFilter([](intx) {returnx % 2 0; });auto evenNumbers evenFilter(numbers);// {2, 4, 6, 8, 10}// 过滤大于5的数Filter greaterFilter([](intx) {returnx 5; });auto greaterNumbers greaterFilter(numbers);// {6, 7, 8, 9, 10}6. 高级应用场景6.1 闭包模拟12345678910111213141516classClosure {private:intcapture_value;public:Closure(intval) : capture_value(val) {}intoperator()(intx)const{returnx capture_value;}intoperator()(intx,inty)const{returnx * y capture_value;}};// 调用示例Closure closure(10);intresult1 closure(5);// 返回 15 (5 10)intresult2 closure(3, 4);// 返回 22 (3 * 4 10)6.2 函数组合器1234567891011121314151617templatetypenameF,typenameGclassCompose {private:F f;G g;public:Compose(F f_func, G g_func) : f(f_func), g(g_func) {}templatetypenameTauto operator()(T x)const- decltype(f(g(x))) {returnf(g(x));}};// 调用示例auto square [](intx) {returnx * x; };auto increment [](intx) {returnx 1; };Composedecltype(square), decltype(increment) compose(square, increment);intresult compose(5);// 先执行 increment(5) 6, 再执行 square(6) 367. 性能考虑与最佳实践7.1 const 修饰符使用1234567classStatelessFunction {public:// 无状态函数对象应使用 const 修饰intoperator()(intx)const{returnx * 2;}};7.2 引用参数传递1234567classStringProcessor {public:std::string operator()(conststd::string input)const{// 使用 const 引用避免拷贝returninput _processed;}};8. 总结灵活性operator()重载提供了函数对象的灵活性状态保持函数对象可以维护内部状态算法兼容与 STL 算法完美配合性能优势编译时优化避免函数指针调用开销类型安全编译时类型检查避免运行时错误