C++ | 仿函数

仿函数的用法

在C语言时期,如果想要实现回调函数或者是函数参数需要传入函数,通常是用的函数指针。而在C++中,我们一般用仿函数来平替。
仿函数,又叫函数对象。虽然名字叫仿函数,但本质上就是一个重载了 operator() 的类,这个类的核心内容就是这个 operator() 方法,写法实例如下:

// 仿函数的类
class Showme
{
public:void operator()(string name = "xiaoming"){cout << "我的名字是 " << name << endl;}
};// 测试的类
template<typename Show>
class test
{
public:void fun(){show();show("wugang");}
private:Show show;
};int main()
{// 仿函数做函数参数Showme show;show();show("lihua");cout << "****************" << endl;// 仿函数做类的模板参数test<Showme> myshow;myshow.fun();return 0;
}

可以看到,当我们用仿函数的类定义出了对象之后,那么这个对象在用法上就相当于是一个函数了,其写法已经和函数调用无异了,这也是为什么这个东西叫“仿函数”的原因之一。

其实单从用法角度来讲,函数对象就相当于函数指针。只不过综合来讲,仿函数的优势更大:

  1. 灵活性和可定制性: 函数对象是类的实例,因此可以包含某些状态信息(通过成员变量),并且可以定义操作符重载,使得函数对象可以像普通函数一样调用。这意味着可以实现更灵活和可定制的行为。
  2. 性能优势: 一些编译器可以对函数对象进行内联优化,因为函数对象是类的实例,而函数指针则可能无法被内联。内联可以减少函数调用的开销,从而提高性能。
  3. 类型安全: 函数对象是类型安全的,因为它们是类的实例。编译器可以在编译时检查函数对象的类型,避免了在运行时可能发生的类型错误。
  4. 可组合性: 函数对象可以被组合起来形成更复杂的操作,这通常通过函数对象适配器(如std::bind、std::function等)来实现。这种组合性使得函数对象在STL中被广泛使用,例如在算法中可以传递不同的函数对象来实现不同的行为。
  5. 更多的操作符重载: 函数对象可以重载多个操作符,而函数指针只能代表一个函数。这意味着函数对象可以模拟更复杂的操作,而不仅仅局限于函数调用。

内建仿函数

STL内建了一些函数对象,可大致分为算数类函数对象,关系运算类函数对象,逻辑运算类函数对象这3类。这些函数对象用法和一般函数对象完全一致,只是这些常用的函数对象都被封装在库中了,使我们不用再自己写了,提高了编码效率。至于具体有哪些内建函数对象见下图:

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

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

相关文章

车载通信架构 —— DDS协议介绍

车载通信架构 —— DDS协议介绍 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和…

leetcode解题思路分析(一百四十九)1297 - 1304 题

子串的最大出现次数 给你一个字符串 s &#xff0c;请你返回满足以下条件且出现次数最大的 任意 子串的出现次数&#xff1a; 子串中不同字母的数目必须小于等于 maxLetters 。 子串的长度必须大于等于 minSize 且小于等于 maxSize 。 首先能想到的是从MinSize开始遍历查找&am…

Linux网络监控工具 - iftop

iftop 是一个基于 libpcap 库的网络流量监控工具。它通过监听指定网络接口上的数据包&#xff0c;并分析这些数据包的源地址、目标地址、源端口、目标端口、协议等信息&#xff0c;从而实时显示网络流量的相关统计信息。 安装 在大多数Linux发行版中&#xff0c;您可以使用包管…

计算机竞赛 行人重识别(person reid) - 机器视觉 深度学习 opencv python

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习行人重识别(person reid)系统 该项目…

CSShas伪类选择器案例附注释

<!DOCTYPE html> <html lang="en"> <head><meta charset

配置文件生成器-秒杀SSM的xml整合

配置文件生成器-秒杀SSM的xml整合 思路&#xff1a; 通过简单的配置&#xff0c;直接生成对应配置文件。 maven坐标 <dependencies><!-- 配置文件生成 --><dependency><groupId>org.freemarker</groupId><artifactId>freemarker<…

洛谷1631 序列合并(优先队列)

题目描述 有两个长度为 N 的单调不降序列 ,A,B&#xff0c;在 A,B 中各取一个数相加可以得到 N2 个和&#xff0c;求这 N2 个和中最小的 N 个。 输入格式 第一行一个正整数 N&#xff1b; 第二行 N 个整数 1…A1…N​。 第三行 N 个整数 1…B1…N​。 输出格式 一行 N 个…

理解docx格式5

数字与级 在numbering元素的<w:abstractNum>里面定义,用<w:num>在数字部分内创建元素. <w:numbering> <w:abstractNum w:abstractNumId"0"> <抽象数字/> <w:nsid w:val"099A081C"/> <w:multiLevelType w:val&quo…

maven 初学

1. maven 安装 配置安装 路径 maven 下载位置: D:\software\apache-maven-3.8.6 默认仓库位置: C:\Users\star-dream\.m2\repository 【已更改】 本地仓库设置为&#xff1a;D:\software\apache-maven-3.8.6\.m2\repository 镜像已更改为阿里云中央镜像仓库 <mirrors>…

Kubernetes概述架构与工作流程简述

文章目录 Kubernetes概述Kubernetes优势Kubernetes 集群组件控制平面组件Node 组件 Kubernetes工作流程下期预告 Kubernetes概述 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥…

简易版Pycharm(2023)+Conda开发环境配置教程

困 扰 不知道为什么&#xff0c;自从Pycharm更新了新的版本以后&#xff0c;在Pycharm中为项目工程配置Python解释器环境时&#xff0c;总是不能像以前那么方便。 比如&#xff0c;当前Conda中有十个不同的开发环境&#xff0c;每个环境一个名称&#xff0c;比如&#xff0c;p…

小程序实现人脸识别功能

调用api wx.startFacialRecognitionVerify 第一步: // 修改方法expertUpdate() {wx.startFacialRecognitionVerify({name: _this.registerForm.realName, //身份证名称idCardNumber: _this.registerForm.idCard, //身份证号码checkAliveType: 1, //屏幕闪烁(人脸核验的交互…

VB.NET vs. VB6.0:现代化编程语言 VS 经典老旧语言

目录 ​.NET背景&#xff1a; 特点: VB6.0背景&#xff1a; 特点: 两者之间的不同: 总结: 升华: .NET背景&#xff1a; VB.NET一种简单&#xff0c;现代&#xff0c;面向对象计算机编程语言&#xff0c;有微软开发&#xff0c;VB.NET是一种基于.NET Framework的面向对象…

golang gin——中间件编程以及jwt认证和跨域配置中间件案例

中间件编程jwt认证 在不改变原有方法的基础上&#xff0c;添加自己的业务逻辑。相当于grpc中的拦截器一样&#xff0c;在不改变grpc请求的同时&#xff0c;插入自己的业务。 简单例子 func Sum(a, b int) int {return a b }func LoggerMiddleware(in func(a, b int) int) f…

docker compose 管理应用服务的常用命令

一 、docker compose 是什么 Docker Compose是一个用来管理多个关联容器的工具&#xff0c;可以根据配置文件自动构建、管理、编排一组容器。 Docker Compose语境下的“服务”是指一组容器共同构成的一个应用服务后端。 Docker Compose语境下的“项目”是由一个或多个应用服务…

【C++设计模式之观察者模式:行为型】分析及示例

简介 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;使得当一个对象的状态发生变化时&#xff0c;所有依赖它的对象都能够自动收到通知并更新。 描述 观察者模式由两个核心件组成&#xff1…

来单提醒/客户催单 ----苍穹外卖day9

来单提醒 需求分析 代码开发 注意:前端请求的并不是8080端口;而是先请求Nginx,Nginx进行反向代理以后转发到8080端口 这段代码首先创建了一个orders类用于更新订单状态 并且在更新状态后使用websocket发送给后端提醒 将信息放在map后,使用json的string化方式传给一个接收对象,…

类 ChatGPT 模型存在的局限性

尽管类ChatGPT模型经过数月的迭代和完善&#xff0c;已经初步融入了部分领域以及人们的日常生活&#xff0c;但目前市面上的产品和相关技术仍然存在一些问题&#xff0c;以下列出一些局限性进行详细说明与成因分析&#xff1a; 1&#xff09;互联网上高质量、大规模、经过清洗…

【广州华锐互动】动物解剖学AR互动学习平台

增强现实&#xff08;AR&#xff09;是一种将虚拟信息叠加到现实世界中的技术。通过智能手机、平板电脑或AR眼镜等设备&#xff0c;AR技术可以创建出逼真的虚拟物体&#xff0c;这些物体可以与现实世界的环境相互交互。 AR技术在教育领域的应用非常广泛&#xff0c;包括历史、科…

文生视频领域SOTA工作Make-A-Video:论文解读和代码赏析

Diffusion Models专栏文章汇总:入门与实战 前言:2022年年底Meta AI提出了Make-A-Video,一年过去了依旧是文生视频领域的SOTA工作,在主流数据集上依旧保持着最先进的指标。论文利用了预训练的Text-to-Image模型扩展到Text-to-Video任务,大大降低了视频生成的门槛;论文中提…