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

用 Codex + GitHub Spec-Kit 做一次“规格驱动开发”实战

用 Codex + GitHub Spec-Kit 做一次“规格驱动开发”实战

* 用 Codex + GitHub Spec-Kit 做一次“规格驱动开发”实战 * 1) 初始化:把 spec-kit 工作区真正建起来(多种方式) * 方式 A:uvx 一次性运行(推荐) * 方式 B:uv tool install(全局安装 specify) * 方式 C:pipx 安装(Python 工具常用法) * 2) 初始化后,正确的目录结构长什么样( * 3) 在 Codex 里跑 speckit:统一输入规则(非常重要) * 4) 标准流水线:Constitution → Spec → Plan → Tasks → Implement * Step 1:

By Ne0inhk
VSCode Github Copilot使用OpenAI兼容的自定义模型方法

VSCode Github Copilot使用OpenAI兼容的自定义模型方法

背景 VSCode 1.105.0发布了,但是用户最期待的Copilot功能却没更新!!! (Github Copilot Chat 中使用OpenAI兼容的自定义模型。) 🔥官方也关闭了Issue,并且做了回复,并表示未来也不会更新这个功能: “实际上,这个功能在可预见的未来只面向内部人员开放,作为一种“高级”实验功能。是否实现特定模型提供者的功能,我们交由扩展作者自行决定。仅限内部人员使用可以让我们快速推进,并提供一种可能并非始终百分之百完善,但能够持续改进并快速修复 bug 的体验。如果这个功能对你很重要,我建议切换到内部版本 insider。” 🤗 官方解决方案:安装VSCode扩展支持 你们完全不用担心只需要在 VS Code 中安装扩展:OAI Compatible Provider for Copilot 通过任何兼容 OpenAI 的提供商驱动的 GitHub Copilot Chat,使用前沿开源大模型,如 Kimi K2、DeepSeek

By Ne0inhk
使用 VS Code 将项目代码上传到 Gitee 的完整指南

使用 VS Code 将项目代码上传到 Gitee 的完整指南

在现代软件开发流程中,版本控制是不可或缺的一环。 Gitee(码云)作为国内领先的代码托管平台,为开发者提供了稳定、快速的 Git 服务。 本文将详细介绍如何使用 Visual Studio Code(VS Code)将本地项目代码上传至 Gitee 仓库,涵盖从环境配置、初始化仓库到推送代码的完整流程。 一、准备工作 1. 安装必要工具 * Git:确保你的系统已安装 Git。 可通过终端运行 git --version  或 git -v 验证是否安装成功。 * VS Code:下载并安装 Visual Studio Code。 * Gitee 账号:前往 Gitee 官网 注册账号(如尚未注册)。 2. 安装 VS

By Ne0inhk
使用Git将代码从远程仓库拉取到本地(详细图解、简单易懂)

使用Git将代码从远程仓库拉取到本地(详细图解、简单易懂)

目录 一、前言 二、全流程 一、前言 本博客主要记录一下使用Git将代码从远程仓库拉取到本地的全流程,使用Git拉取代码在学校内多同学合作开发项目或者是实习拉取公司代码等场景都很常见,单纯记录希望对你有帮助 二、全流程 首先在你想要存放代码的位置新建一个文件夹并改名 进入刚刚创建的空文件中,右键然后点击显示更多选项 然后点击Git Bash Here 然后就会出现如图所示的命令行窗口 此时先不用管命令行窗口,找到你要远程仓库所在的平台(我这里以Gitee演示),如图点击克隆/下载按钮 HTTPS下方就是远程仓库的url地址,只要有远程仓库的url地址,只需要在刚刚的命令行窗口打上git clone在将url地址复制在后面再回车即可(Gitee下面的提示也给了,直接复制带git clone的命令就行,没有的话就自己敲git clone) 复制到命令行窗口之后,等待片刻即可 然后点开刚刚创建的文件夹就可以看到拉取下来的代码了,后续用IDEA打开该文件就可以在本地进行开发了

By Ne0inhk