故宫网站建设/广告公司

故宫网站建设,广告公司,基于wamp的动态网站开发,项目网络图和关键路径前提: 本博客对比 函数指针实现回调 和 仿函数 ,突出仿函数的优势。 目的: 一个类要能够灵活的调用两个函数,essfc 和 greaterfc,分别用于比较两个整数的大小: ①:lessfc:判断 x …

前提:

        本博客对比 函数指针实现回调 和  仿函数 ,突出仿函数的优势。

目的:

        一个类要能够灵活的调用两个函数,essfc 和 greaterfc,分别用于比较两个整数的大小:

①:lessfc:判断 x 是否小于 y,如果是则返回 true,否则返回 false

②:greaterfc:判断 x 是否大于 y,如果是则返回 true,否则返回 false

一:函数指针实现回调

①:普通代码:

//lessfc函数 x<y?
bool lessfc(int x, int y)
{return x < y;
}//greaterfc函数 x>y?
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函数 且传两个intA aa2(greaterfc);//创建一个对象aa2.func(1, 2);//调用对象的func函数 且传两个int
}

运行结果:

解释:

类 A 的行为可以通过传入不同的函数指针来动态改变:

        传入 lessfc 时,func 方法会执行小于比较。

        传入 greaterfc 时,func 方法会执行大于比较。

②:加上模版的代码:

//lessfc函数 x<y?
template<class T>
bool lessfc(T x, T y)
{return x < y;
}//greaterfc函数 x>y?
template<class T>
bool greaterfc(T x, T y)
{return x > y;
}// A这个类体现了--->函数指针实现回调
template<class 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()
{A<int> aa1(lessfc);//因为有模版,所以显式传模版的类型去创建一个对象aa1.func(1, 2);//调用对象的func函数 且传两个int 与创建时T的类型吻合A<double>aa2(greaterfc);//因为有模版,所以显式传模版的类型创建一个对象aa2.func(1.1, 1.0);//调用对象的func函数 且传两个double 与创建时T的类型吻合
}

解释:加上模版之后,范围更广了

二:仿函数

定义:一个对象能像函数一样用,实际上调用的是我们重载的 operator()

①:普通代码:

//定义仿函数
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;}
};template<class 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()
{A<less<int>> aa1;aa1.func(1, 2); // 输出 1 < 2 的结果(true)A<greater<int>> aa2;aa2.func(1, 2); // 输出 1 > 2 的结果(false)
}

运行结果:

①:不再像函数指针那样,赤裸裸的写两个函数,而是在两个类中对()运算符进行重载,重载的定义在写函数的功能

②:需要用仿函数的类的模版参数,就是那两个仿函数的类名,在类中进行仿函数类的对象的创建,再结合类中函数(如func)的参数,最后结合()进行函数的调用,仿函数对象看见()就会实现重载后的功能

③:main函数中的less<int>,就是对仿函数进行显式的调用,此时的模版不再是简单的类型,而是一个类

②:加上模版的代码:

//定义仿函数
template<class T>
class lessfc //将之前的lessfc函数封装成一个类
{
public://类中仅需对()这个操作符进行重载bool operator()(const T& x, const T& y){return x < y;}
};//定义仿函数
template<class T>
class greaterfc //将greaterfc函数封装成一个类
{
public://类中仅需对()这个操作符进行重载bool operator()(const T& x, const T& y){return x > y;}
};template<class 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()
{A<less<int>, int> aa1;aa1.func(1, 2); // 输出 1 < 2 的结果(true)A<greater<double>, double> aa2;aa2.func(1.1, 1.0); // 输出 1.1 >1.0 的结果(ture)
}

运算结果:

解释:对三个类都加上模版之后,范围更广了

三:仿函数更优的点

1. 更灵活的功能扩展

仿函数:仿函数是一个类对象,可以包含成员变量和成员函数,因此可以在调用时保存状态(例如计数器、配置参数等)。

函数指针:函数指针只能指向一个静态函数,无法保存状态,功能扩展性较差。

2. 更高的性能

仿函数:仿函数通常是内联的(inline),编译器可以优化其调用,减少函数调用的开销。

函数指针:函数指针的调用需要通过指针间接调用,无法内联,性能稍差。

3. 更强的类型安全

仿函数:仿函数是类对象,类型信息在编译时确定,类型安全性更高。

函数指针:函数指针的类型信息较弱,容易出错(例如指向错误类型的函数)。


4. 更好的通用性

仿函数:仿函数可以与模板结合,实现高度通用的代码。例如,STL 中的排序算法 std::sort 可以通过传入不同的仿函数实现升序或降序排序。

函数指针:函数指针的通用性较差,难以与模板结合。

5. 支持运算符重载
仿函数:仿函数可以重载 operator(),使得对象可以像函数一样被调用,语法更直观。

函数指针:函数指针的调用语法较为繁琐。

6. 更易于组合和扩展
仿函数:仿函数可以通过继承、组合等方式扩展功能。

函数指针:函数指针的功能扩展性较差,难以实现复杂的逻辑组合。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73138.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CH32V208蓝牙内部带运放32位RISC-V工业级微控制器

开发板 CH32V208CBU6立创格式的开发板上述链接可下载&#xff0c;官方文件进行了转换&#xff0c;使用前请仔细核对。 CH32V208CBU6原理图&#xff0c;上述图片为芯片部分。已进行DRC。 CH32V208CBU6 PCB三维图&#xff0c;上述图片为芯片部分。已进行DRC。 概述 CH32V208C…

整理和总结微信小程序的高频知识点

前言 近期萌生了一些想法&#xff0c;感觉可以做一个小程序作为产出。 但小程序做得比较少&#xff0c;因此边做边复习。整理和总结了一些高频知识点和大家一起分享。 一、模板和组件 1.1模板&#xff08;Template&#xff09; 优势 简单灵活&#xff1a;模板定义和使用都较…

1996-2023年各省公路里程数据(无缺失)

1996-2023年各省公路里程数据&#xff08;无缺失&#xff09; 1、时间&#xff1a;1996-2023年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;公路里程&#xff08;万公里&#xff09; 4、范围&#xff1a;31省 5、指标解释&#xff1a;公路里程指报告期末…

Wi-Fi NAN 架构(Wi-Fi Aware Specification v4.0,第2章:2.7~2.9)

1. NAN 介质访问控制层&#xff08;MAC&#xff09; NAN MAC负责通过参与 NAN同步信标帧&#xff08;NAN Synchronization Beacon frame&#xff09;的传输&#xff0c;获取并维护设备所在的NAN集群的同步。作为同步功能的一部分&#xff0c;NAN MAC运行 TSF 定时器。NAN MAC还…

《Python实战进阶》No26: CI/CD 流水线:GitHub Actions 与 Jenkins 集成

No26: CI/CD 流水线&#xff1a;GitHub Actions 与 Jenkins 集成 摘要 持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;是现代软件开发中不可或缺的实践&#xff0c;能够显著提升开发效率、减少错误并加速交付流程。本文将探讨如何利用 GitHub Actio…

HR人员和组织信息同步AD域服务器实战方法JAVA

HR人员和组织信息同步AD域服务器 前期准备AD域基础知识整理HR同步AD的逻辑代码结构配置文件设置启动类HR组织的BeanHR人员Bean获取HR人员和组织信息的类AD中处理组织和人员的类日志配置 POM.xml文件生成EXE文件服务器定时任务异常问题注意事项 前期准备 1、开发语言&#xff1…

修改服务器windows远程桌面默认端口号

修改服务器windows远程桌面默认端口号 在Windows服务器上修改远程桌面协议&#xff08;RDP&#xff09;的默认端口&#xff08;3389&#xff09;可以增强服务器的安全性&#xff0c;减少被恶意扫描和攻击的风险。以下是修改远程端口的详细步骤&#xff1a; 按 Win R 打开运行…

MuJoCo 仿真 Panda 机械臂!末端位置实时追踪 + 可视化(含缩放交互)

视频讲解&#xff1a; MuJoCo 仿真 Panda 机械臂&#xff01;末端位置实时追踪 可视化&#xff08;含缩放交互&#xff09; 仓库地址&#xff1a;GitHub - LitchiCheng/mujoco-learning 本期介绍下&#xff0c;mujoco_py这个库很老了&#xff0c;最新的版本可以通过mujoco的p…

在Mac M1/M2芯片上完美安装DeepCTR库:避坑指南与实战验证

让推荐算法在Apple Silicon上全速运行 概述 作为推荐系统领域的最经常用的明星库&#xff0c;DeepCTR集成了CTR预估、多任务学习等前沿模型实现。但在Apple Silicon架构的Mac设备上&#xff0c;安装过程常因ARM架构适配、依赖库版本冲突等问题受阻。本文通过20次环境搭建实测…

spring boot 拦截器

1、创建ServletConfig配置类 package com.pn.config;import com.pn.filter.LoginFilter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.web.servlet.Fil…

论文阅读笔记:Denoising Diffusion Probabilistic Models (2)

接论文阅读笔记&#xff1a;Denoising Diffusion Probabilistic Models (1) 3、论文推理过程 扩散模型的流程如下图所示&#xff0c;可以看出 q ( x 0 , 1 , 2 ⋯ , T − 1 , T ) q(x^{0,1,2\cdots ,T-1, T}) q(x0,1,2⋯,T−1,T)为正向加噪音过程&#xff0c; p ( x 0 , 1 , …

【大模型基础_毛玉仁】3.5 Prompt相关应用

目录 3.5 相关应用3.5.1 基于大语言模型的Agent3.5.2 数据合成3.5.3 Text-to-SQL3.5.4 GPTs 3.5 相关应用 Prompt工程应用广泛&#xff0c;能提升大语言模型处理基础及复杂任务的能力&#xff0c;在构建Agent、数据合成、Text-to-SQL转换和设计个性化GPTs等方面不可或缺。 . …

深入理解 Linux ALSA 音频架构:从入门到驱动开发

文章目录 一、什么是 ALSA?二、ALSA 系统架构全景图核心组件详解:三、用户空间开发实战1. PCM 音频流操作流程2. 高级配置(asound.conf)四、内核驱动开发指南1. 驱动初始化模板2. DMA 缓冲区管理五、高级主题1. 插件系统原理2. 调试技巧3. 实时音频优化六、现代 ALSA 发展七…

探秘海螺 AI 视频与计算机视觉算法的奇妙融合

目录 开篇&#xff1a;数字浪潮下的视频新变革 蓝耘 Maas 平台与海螺 AI 视频&#xff1a;崭露头角的视频创作利器 图片生成视频&#xff1a;化静为动的魔法 文本生成视频&#xff1a;文字到画面的奇妙转换 注册与登录 计算机视觉算法&#xff1a;海螺 AI 视频的核心驱动力…

【数据分享】我国乡镇(街道)行政区划数据(免费获取/Shp格式)

行政区划边界矢量数据是我们在各项研究中最常用的数据。之前我们分享过2024年我国省市县行政区划矢量数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff0c;很多小伙伴拿到数据后咨询有没有精细到乡镇&#xff08;街道&#xff09;的行政区划矢量数据&#xff01;…

同一个局域网的话 如何访问另一台电脑的ip

在局域网内访问另一台电脑&#xff0c;可以通过以下几种常见的方法来实现&#xff1a; ‌直接通过IP地址访问‌&#xff1a; 首先&#xff0c;确保两台电脑都连接在同一个局域网内。获取目标电脑的IP地址&#xff0c;这可以通过在目标电脑上打开命令提示符&#xff08;Windows系…

LINUX基础 [二] - 进程概念

目录 前言 什么是进程 如何管理进程 描述进程 组织进程 如何查看进程 通过 ps 命令查看进程 通过 ls / proc 命令查看进程 通过系统调用 获取进程标示符 前言 在学习了【Linux系统编程】中的 ​ 操作系统 和 冯诺依曼体系结构 之后&#xff0c;我们已经对系统应该有…

股指期货贴水波动,影响哪些投资策略?

先来说说“贴水”。简单来说&#xff0c;贴水就是股指期货的价格比现货价格低。比如&#xff0c;沪深300指数现在是4000点&#xff0c;但股指期货合约的价格只有3950点&#xff0c;这就叫贴水。贴水的大小会影响很多投资策略的收益&#xff0c;接下来我们就来看看具体的影响。 …

在刀刃上发力:如何精准把握计划关键节点

关键路径分析是项目管理中的一种重要方法&#xff0c;它通过在甘特图中识别出项目中最长、最关键的路径&#xff0c;来确定项目的最短完成时间。 关键路径上的任务都是项目成功的关键因素&#xff0c;任何延误都可能导致整个项目的延期。关键路径分析对于项目管理者来说至关重要…

浔川社团官方联合会维权成功

在2025.3.2日&#xff0c;我社团检测文章侵权中&#xff0c;检测出3篇文章疑似遭侵权&#xff0c;随后&#xff0c;总社团联合会立即联系CSDN版权&#xff0c;经过17天的维权&#xff0c;至今日晚&#xff0c;我社团维权成功&#xff01;侵权文章全部被设置为转载。 在此&…