发布时间:2026/9/3 11:08:03
仿函数 VS 函数指针回调 目录摘要一函数指针回调解决问题①函数回调②函数回调模版二仿函数解决问题①仿函数②仿函数模版三仿函数的优势摘要本博客对比函数指针实现回调和仿函数去解决同一个问题突出仿函数的优势。一函数指针回调解决问题现在我们有一个类A其中有一个成员函数void func(int xx, int yy)我们有时候想要知道xx是否比yy谁大有时候想知道xx是否比yy小请问怎么做呢①函数回调我们让类A的成员变量新增一个函数指针类型_pf同理构造函数接收一个函数指针类型的变量pf赋给_pf当我们想比较xx和yy谁小的时候我们就传递lessfc的函数指针过去然后在类A的成员函数func中调用_pf(xx,yy)也就是使用这个lessfc函数比较谁小同理当我们想比较xx和yy谁大的时候我们就传递greaterfc的函数指针过去然后在类A的成员函数func中调用_pf(xx,yy)也就是使用这个greaterfc函数比较谁大//lessfc函数 xy bool lessfc(int x, int y) { return x y; } //greaterfc函数 xy? bool greaterfc(int x, int y) { return x y; } // A这个类体现了---函数指针实现回调 class A { public: A(bool(*pf)(int, int))//构造函数接收一个函数指针 并赋值给成员变量 :_pf(pf) {} void func(int xx, int yy)//func函数接收两个参数 { cout void func(int xx, int yy) _pf(xx, yy) endl;; } //用接收到的函数指针结合两个int参数调用该函数 bool(*_pf)(int, int);//成员变量也是一个函数指针类型 }; int main() { A aa1(lessfc);//创建一个对象 aa1.func(1, 2);//调用对象的func函数 且传两个int A aa2(greaterfc);//创建一个对象 aa2.func(1, 2);//调用对象的func函数 且传两个int }运行结果②函数回调模版当然上面的函数回调的例子比较局限于xx和yy为int类型我们一般会加上模版参数//lessfc函数 xy templateclass T bool lessfc(T x, T y) { return x y; } //greaterfc函数 xy? templateclass T bool greaterfc(T x, T y) { return x y; } // A这个类体现了---函数指针实现回调 templateclass T class A { public: A(bool(*pf)(T, T))//构造函数接收一个函数指针 并赋值给成员变量 :_pf(pf) {} void func(T xx, T yy)//func函数接收两个参数 { cout void func(T xx, T yy) _pf(xx, yy) endl;; } //用接收到的函数指针结合两个int参数调用该函数 bool(*_pf)(T, T);//成员变量也是一个函数指针类型 }; int main() { Aint aa1(lessfc);//因为有模版所以显式传模版的类型去创建一个对象 aa1.func(1, 2);//调用对象的func函数 且传两个int 与创建时T的类型吻合 Adoubleaa2(greaterfc);//因为有模版所以显式传模版的类型创建一个对象 aa2.func(1.1, 1.0);//调用对象的func函数 且传两个double 与创建时T的类型吻合 }解释加上模版之后范围更广了⚠️函数回调虽然达到了我们想要的效果但是缺点众多1就是类型书写麻烦2就是会影响了类的成员变量和构造函数二仿函数解决问题而仿函数就是更优秀的解决方法①仿函数我们实现一个两个类分别叫做lessfc和greaterfc两个类内部都对()运算符进行重载lessfc对()运算符重载为返回参数x是否比y小的bool值而greaterfc重载内部返回参数x是否比y大的bool值然后类A新增一个模版参数Comapre其接收lessfc或者lessfc两个仿函数中的一个当我们类A内部的func想比较xx是否比yy小的时候则我们传递给Comapre参数lessfc然后在类A内部创建Comapre com也就是创建了一个lessfc的对象然后在func内部调用com的成员函数()运算符重载com(xx, yy)即可同理func想比较xx是否比yy大不再赘述....//定义仿函数 class lessfc //将之前的lessfc函数封装成一个类 { public: //类中仅需对()这个操作符进行重载 bool operator()(const int x, const int y) { return x y; } }; //定义仿函数 class greaterfc //将greaterfc函数封装成一个类 { public: //类中仅需对()这个操作符进行重载 bool operator()(const int x, const int y) { return x y; } }; templateclass Comapre class A//A这个类要使用仿函数 { public: void func(int xx, int yy) { Comapre com;//创建一个 Comapre 类型的对象 com。 cout void func(int xx, int yy) com(xx, yy) endl;; //调用 com(xx, yy)即调用仿函数的 operator()比较 xx 和 yy。 } }; int main() { Alessint aa1; aa1.func(1, 2); // 输出 1 2 的结果true Agreaterint aa2; aa2.func(1, 2); // 输出 1 2 的结果false }运行结果解释优点在于我们不用复杂的书写函数指针类型其次我们不用修改成员变量和构造函数了我们只需给类A新增一个模版参数Comapre即可②仿函数模版当然同理我们加上模版参数T应用的范围更广泛了//定义仿函数 templateclass T class lessfc //将之前的lessfc函数封装成一个类 { public: //类中仅需对()这个操作符进行重载 bool operator()(const T x, const T y) { return x y; } }; //定义仿函数 templateclass T class greaterfc //将greaterfc函数封装成一个类 { public: //类中仅需对()这个操作符进行重载 bool operator()(const T x, const T y) { return x y; } }; templateclass Comapre, class T class A//A这个类要使用仿函数 { public: void func(T xx, T yy) { Comapre com;//创建一个 Comapre 类型的对象 com。 cout void func(T xx, T yy) com(xx, yy) endl;; //调用 com(xx, yy)即调用仿函数的 operator()比较 xx 和 yy。 } }; int main() { Alessint, int aa1; aa1.func(1, 2); // 输出 1 2 的结果true Agreaterdouble, double aa2; aa2.func(1.1, 1.0); // 输出 1.1 1.0 的结果ture }运行结果三仿函数的优势1. 更灵活的功能扩展仿函数仿函数是一个类对象可以包含成员变量和成员函数因此可以在调用时保存状态例如计数器、配置参数等。函数指针函数指针只能指向一个静态函数无法保存状态功能扩展性较差。2. 更高的性能仿函数仿函数通常是内联的inline编译器可以优化其调用减少函数调用的开销。函数指针函数指针的调用需要通过指针间接调用无法内联性能稍差。3. 更强的类型安全仿函数仿函数是类对象类型信息在编译时确定类型安全性更高。函数指针函数指针的类型信息较弱容易出错例如指向错误类型的函数。4. 更好的通用性仿函数仿函数可以与模板结合实现高度通用的代码。例如STL 中的排序算法 std::sort 可以通过传入不同的仿函数实现升序或降序排序。函数指针函数指针的通用性较差难以与模板结合。5. 支持运算符重载仿函数仿函数可以重载 operator()使得对象可以像函数一样被调用语法更直观。函数指针函数指针的调用语法较为繁琐。6. 更易于组合和扩展仿函数仿函数可以通过继承、组合等方式扩展功能。函数指针函数指针的功能扩展性较差难以实现复杂的逻辑组合。 [ 作者 ] shylyly [ 首次发布 ] 2025.3.2❌ [ 最新修改 ] 2026.9.2 [ 声明 ] 由于笔者水平有限文中难免有疏漏或不妥之处还望读者不吝赐教

相关新闻

2026/9/3 11:08:03

MATLAB实现相移法提取面波频散曲线:从原理到实战避坑指南

简介:本资源是一套面向地球物理勘探专业师生及科研人员的MATLAB实操工具,聚焦多道面波分析中相移法频散曲线提取这一核心任务,解决野外地震记录中面波速度—频率关系建模难、相位解缠易出错等实际问题。压缩包共2个文件(1个主程序…

2026/9/3 11:08:03

评估dso直接稀疏里程计

部署好dso直接稀疏里程计后,运行数据集生成result.txt,使用evo进行评估 出现问题 1.(1)问题:生成的result.txt第一列“时间戳”均为0 (2)解决: 在运行数据集下,新建一…

2026/9/3 11:08:03

量子计算、通信与测量三大核心技术突破与产业化应用分析

如果你最近关注科技新闻,可能会注意到一个现象:量子技术领域的突破性消息突然密集出现。从量子计算原型机的性能提升,到量子通信网络的实际部署,再到量子测量技术的产业化应用——这些进展不再是实验室里的遥远概念,而…

2026/9/3 11:28:07

ESP32蓝牙开发:从硬件原理到连接稳定性优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 11:28:07

uniapp实现弧形tab选项卡

1、效果图2、完整代码<template><view class"wrap"><view class"tab_box"><viewclass"tab_item":class"{ active: tabIndex index }"v-for"(item, index) in tabList":key"index"click&quo…

2026/9/3 11:28:07

去中心化KYC解析:用DID与可验证凭证实现身份自主验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/3 11:23:06

TimesFM 零样本时间序列预测:能力边界与选型参考

TimesFM 零样本时间序列预测&#xff1a;能力边界与选型参考 【免费下载链接】timesfm TimesFM (Time Series Foundation Model) is a pretrained time-series foundation model developed by Google Research for time-series forecasting. 项目地址: https://gitcode.com/G…

2026/9/1 16:02:17

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出&#xff0c;第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器&#xff0c;出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台&#xff0c;直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/9/2 9:00:32

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流&#xff1a;为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历&#xff1a;明明传感器本身性能很好&#xff0c;信号输出却一塌糊涂——噪声大、漂移明显、重复性差&#xff0c;怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/2 8:41:06

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起&#xff0c;其实就是嵌入式开发里最常遇到的一类需求&#xff1a;用一块不算贵的 MCU&#xff0c;同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控&#xff0c;主频…

2026/9/3 0:02:06

零基础装 OpenClaw 小龙虾 AI:Windows 一键部署教程与避坑要点

Windows 部署 OpenClaw 完整教程&#xff5c;本地 AI 智能体 5 分钟落地&#xff0c;环境配置一次搞定 版本说明&#xff1a;Windows 3.1.0 / Mac 2.7.9 写在前面 近两年开源 AI 领域有一款被称作「数字员工」的工具持续走热&#xff0c;它就是 OpenClaw&#xff0c;圈内人更习…

2026/9/3 0:02:06

Hermes Agent 本地部署新方案:Windows 整合包减少依赖报错

Windows 本地部署 Hermes 太麻烦&#xff1f;这版一键包 5 分钟快速跑通 很多人想体验 Hermes Agent&#xff0c;但真正开始部署时&#xff0c;往往会卡在环境配置这一步。 需要安装各类依赖、调试运行环境、处理路径问题&#xff0c;还容易遇到命令行报错、系统拦截、文件缺…

2026/9/3 0:02:06

实测 OpenClaw 一键包,5 分钟完成本地自动化环境搭建

OpenClaw 本地 AI 自动化工具部署指南&#xff5c;使用一键包规避环境配置难题 痛点&#xff1a;部署 AI 自动化工具常常要处理 Python、Node.js 各类依赖&#xff0c;版本冲突、环境配置耗费大量时间&#xff0c;OpenClaw 提供一键安装包&#xff0c;降低部署门槛。 适配系统&…

2026/9/2 1:15:22

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/2 1:15:22

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/2 1:15:20

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…