C++ 中 operator() 重载详解

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 算法完美配合
  • 性能优势:编译时优化,避免函数指针调用开销
  • 类型安全:编译时类型检查,避免运行时错误

Read more

Logseq+cpolar:让开源笔记效率翻倍

Logseq+cpolar:让开源笔记效率翻倍

文章目录 * 前言 * **核心价值对比传统方案** * **cpolar赋能远程访问** * 1. 安装Docker * 2. 简单使用演示 * 3. 安装cpolar内网穿透 * 4. 配置公网地址 * 5. 配置固定公网地址 * 当开源软件遇上内网穿透技术,Logseq+CPolar的组合正在重构知识管理的边界。或许真正的生产力革命,始于把数据主权握在自己手中。 前言 还在为商业笔记软件的订阅费用、数据隐私条款或功能限制感到困扰吗?或许你该试试用 Logseq(GitHub 3.3万星)搭配 cpolar内网穿透工具,打造一个完全自主可控的知识管理生态系统。 核心价值对比传统方案 Logseq特性商业软件痛点解决开源无隐藏数据收集避免用户行为被分析利用Markdown+Org-Mode双引擎兼容程序员与学术研究双重需求原生支持PDF批注解决专业文档管理的碎片化问题 cpolar赋能远程访问 这对组合带来以下突破: * 私有化数据存储:将笔记文件存放在本地NAS/旧PC,通过Logseq桌面端运行,再用CPolar生成

By Ne0inhk
2026 最新版|学生认证白嫖 GitHub Copilot Pro 保姆级教程

2026 最新版|学生认证白嫖 GitHub Copilot Pro 保姆级教程

2026 最新版|学生认证白嫖 GitHub Copilot Pro 保姆级教程 作为编程党,谁能拒绝免费的 Copilot Pro?每月省 10 $,解锁无限制代码补全、Anthropic Claude Sonnet 4, GPT-5, Gemini 2.5 Pro等高级模型、每月 300 次 Premium 请求,学生身份认证就能直接白嫖,全程零成本,亲测 2026 年有效!这篇教程把所有步骤、避坑点都捋清楚了,跟着做一遍过,再也不用受免费版额度的气! 前言 先说说为什么一定要冲 Copilot Pro:免费版每月只有 2000 次代码补全 + 50 次聊天请求,写代码刚进入状态就提示额度用完,体验感拉胯;而 Pro

By Ne0inhk

免费获得大模型的Api-Key的方法:英伟达提供GLM-4.7、Minimax M2.1模型和GitHub的AI大模型API申请

免费获得大模型的Api-Key的方法:英伟达提供GLM-4.7、Minimax M2.1模型和GitHub的AI大模型API申请 最近一直在玩OpenClaw,无奈OpenClaw是个消耗token的高手!随随便便问了几个问题就能吃掉百万的token数,妥妥的吞金兽,如果有免费的token就好了! 今天就给大家介绍英伟达和Github的免费大模型API Key的获取方法。 传送门: * • OpenRouter提供的DeepSeek-R1-70B的大模型免费用 * • 获取各大人工智能AI工具通过API和KEY调用的方法 英伟达-Nvidia的免费API Key 说到英伟达,大家的第一反应可能是"卖显卡的大佬"。但很少有人意识到,拥有强大算力的英伟达,也在积极布局AI云服务市场。这波免费开放API的策略,本质上是一个聪明的生态布局——通过免费服务吸引开发者,为未来的商业变现铺路。   注册账号 1.打开英伟达官网 https://build.nvidia.com 点击“Login”   2.输入邮箱 输入邮箱、密码   3.验

By Ne0inhk

爆肝 2 天,用 GLM5 开发了 OpenClaw 接入微信 bot,已开源!

这是苍何的第 493 篇原创! 大家好,我是苍何。 OpenClaw,这个 GitHub 上 18 万 Star 的怪物级开源项目,你们应该都听过了吧? 飞书能接、钉钉能接、企业微信能接、QQ 能接、Discord 能接…… 但偏偏最多人用的「微信个人号」,它不支持。 我翻遍了 GitHub、掘金、知乎,找到的方案要么是企业微信绕一圈,要么是用微信 Web 协议搞,动不动就封号。 说实话,这谁顶得住? 天天在微信上跟朋友聊天、在群里吹水,结果想接个 OpenClaw 都这么费劲? 麻了。 于是我决定自己干。 「爆肝 2 天,我把 OpenClaw 接入了微信个人号,并且已经开源了。」 地址:

By Ne0inhk