C++ | 仿函数

news2024/12/27 10:24:22

仿函数的用法

在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.coloradmin.cn/o/1072231.html

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

相关文章

金融信创黄金三年:小程序生态+跨端技术框架构建

小程序应用场景生态的发展&#xff0c;受益于开源技术的发展&#xff0c;以及响应快速开发的实际业务需求&#xff0c;一些跨端框架如&#xff1a;Electron、wxPython、FinClip、Tauri、Flutter等发展也非常迅速&#xff0c;小程序生态跨端技术框架&#xff0c;不仅能满足自有超…

Python3操作文件系列(三):OpenPyXl模块三大对象操作Excel文件

Python3操作文件系列(一):判断文件|目录是否存在三种方式 Python3操作文件系列(二):文件数据读写|二进制数据读写 Python3数据文件读取与写入 Python3操作文件系列(三):excel文件读写数据 Python操作Excel的三大对象认知升维&#xff1a; Excel对象模型:excel脚本编程的主要…

Idea热部署插件(JRebel for IntelliJ)激活(适用于内网、外网激活)

一.下载激活需要的Jar包 网盘地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1BYS9rE_3EA_isFfz8ORRDg 提取码&#xff1a;1i0c二.进入到第一步下载的jar目录下&#xff0c;运行cmd并且通过java-jar运行jar包 三.运行jar后&#xff0c;将激活地址复制到idea上&a…

docker基本用法

docker 基础常用命令 导入镜像 方式1 docker import kylin_sp2.tar.xz kylin-build:build-hs-220824方式2 [rootccc64 caojingjing]# cat kylin_sp2.tar.xz | docker import - kylin-build:build-hs-220824 sha256:c02cba7686b88e633eff58cddba3189712cbe7f449f2fd37b2033158a…

【JUC系列-10】深入理解ArrayBlockingQueue的底层原理

JUC系列整体栏目 内容链接地址【一】深入理解JMM内存模型的底层实现原理https://zhenghuisheng.blog.csdn.net/article/details/132400429【二】深入理解CAS底层原理和基本使用https://blog.csdn.net/zhenghuishengq/article/details/132478786【三】熟练掌握Atomic原子系列基本…

什么是研发效能DevOps?研发效能方程式又是什么?

研发效能DevOps是一种理念一个方法&#xff0c;旨在通过优化软件开发、运营和维护的流程&#xff0c;实现高效、高质量、快速的价值交付。 研发效能需要解决的是&#xff1a;如何平衡价值、效率、成本这三者的关系&#xff0c;同时寻求可持续发展。研发效能的目标是持续低成本…

多因素共同作用,行业格局或将发生变化

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 1、政经环境改善&#xff0c;数控机床有望走出寒冬 近年来&#xff0c;国家不断提高对于高端数控机床的扶持力度与关注。长…

高效解决 TypeError : ‘ numpy._DTypeMeta‘ object is not subscriptable 问题

文章目录 问题描述解决问题 问题描述 解决问题 参考博文 打开报错位置 AppData\Roaming\Python\Python39\site-packages\cv2\typing\ 添加single-quotes&#xff0c;即单引号 博主说The trick is to use single-quotes to avoid the infamous TypeError: ‘numpy._DTypeMeta’…

ChatGPT可以用于写留学文书嘛?对留学生有什么影响?

自从4月份ChatGPT4.0发布以后&#xff0c;越来越多的AI工具被应用于我们的日常生活当中&#xff0c;而对于学生来说&#xff0c;尤其是在读的留学生朋友&#xff0c;或多或少都使用过&#xff0c;无论是写文章综述还是项目总结&#xff0c;都有十分出色的效果。 01.ChatGPT 可…

算法题:买卖股票的最佳时机含手续费(动态规划解法贪心解法-详解)

这道题有两种解法&#xff1a;动态规划 or 贪心算法。 贪心算法的提交结果要比动态规划好一些&#xff0c;总体上动态规划的解法更容易想到。&#xff08;完整题目附在了最后&#xff09; 1、动态规划解法 设置两个数&#xff0c;dp[0]表示遍历到股票prices[i]时手里没有股…

SSM整合RabbitMQ,Spring4.x整合RabbitMQ

SSM整合RabbitMQ目录 前言版本实现目录参考pom.xml依赖rabbitmq.properties配置文件spring-rabbitmq.xmlspring-mvc.xml或applicationContext.xmlrabbitmq目录下MessageConsumer.javaMessageConsumer2.javaMessageProducer.javaMessageConstant.java 测试调用 扩展消息重发 前言…

飞桨大模型套件:一站式体验,性能极致,生态兼容

在Wave Summit 2023深度学习开发者大会上&#xff0c;来自百度的资深研发工程师贺思俊和王冠中带来的分享主题是&#xff1a;飞桨大模型套件&#xff0c;一站式体验&#xff0c;性能极致&#xff0c;生态兼容。 大语言模型套件PaddleNLP 众所周知PaddleNLP并不是一个全新的模型…

Google-CTF-2016-Stego.pcap数据包解析

Google-CTF-2016&#xff08;a-cute-stegosaurus-100&#xff09; 前言&#xff1a;别人发的题目 随便看看 记录一下解题过程&#xff01; 知识点: 在报文段中有 6Bit 的状态控制码&#xff0c; 分别如下tcp URG&#xff1a;紧急比特&#xff08;urgent&#xff09;&#x…

机械臂抓取的产业落地进展与思考

工业机械臂是一种能够模拟人类手臂动作的机械装置&#xff0c;具有高精度、高速度和高灵活性的特点。近年来&#xff0c;随着人工智能和机器人技术的快速发展&#xff0c;机械臂在工业生产、物流仓储、医疗护理等领域得到了广泛应用。机械臂抓取技术作为机械臂的核心功能之一&a…

C语言进阶---程序环境和预处理

C语言进阶---程序环境和预处理 前言一、程序的翻译环境、执行环境二、详解&#xff1a;C语言程序的编译链接三、预定义符号介绍四、预处理指令 #define五、宏和函数的对比&#xff08;思维导图&#xff09;六、命令定义、预处理指令 #include #undef1.命名约定2.命令行定义 七、…

撤销git本地修改(万能)

使用 git reflog 和 git reset 命令。 git reflog 命令可以查看 Git 中所有的提交历史和分支移动情况&#xff0c;包括已经删除的提交。 您可以通过这个命令找到git操作时间线上的某一个节点&#xff0c;也就是git提交快照的Hash值。 假设您要回滚的提交的哈希值是 e9769f5…

轻松实现时间录入自由!如何在Microsoft Word中轻松插入格式化的日期和时间

在文档中插入当前日期和时间有几个原因。你可能希望将其插入信函或页眉或页脚中。无论是什么原因&#xff0c;Word都可以轻松地将日期和时间插入文档。 如果希望在打开或打印文档时自动更新日期和时间&#xff0c;可以将其作为自动更新的字段插入。该字段也可以随时手动更新。…

【虚拟机】桥接模式下访问外网

目录 一、桥接模式的作用原理 二、配置桥接模式实现外网访问 1、设置 VMnet0 要桥接的网卡 2、虚拟机选择 VMnet0 网卡 3、手动配置虚拟机IP 一、桥接模式的作用原理 桥接模式相当于在当前局域网里创立了一个单独的主机&#xff0c;该主机桥接到宿主主机的网卡&#xff0…

TPU编程竞赛|Stable Diffusion大模型巅峰对决,第五届全球校园人工智能算法精英赛正式启动!

目录 赛题介绍 赛题背景 赛题任务 赛程安排 评分机制 奖项设置 近日&#xff0c;2023第五届全球校园人工智能算法精英赛正式开启报名。作为赛题合作方&#xff0c;算丰承办了“算法专项赛”赛道&#xff0c;提供赛题「面向Stable Diffusion的图像提示语优化」&#xff0c…

ORB-SLAM2运行自己的数据集进行定位教程

ORB-SLAM2只做定位的话&#xff0c;精度还是挺准确的&#xff0c;所以用单目摄像头录制视频&#xff0c;制作自己的数据集跑一下&#xff0c;看看定位精度&#xff0c;将过程加以记录。 文章目录 一、系统配置二、制作数据集1、脚本编写2、配置文件编写3、录制视频素材&#x…