回调函数,仿函数(functor)的区别及各自应用场景

区别:回调函数是一个被作为参数传递的函数。在C语言中,回调函数只能用函数指针实现,在C++、Python、ECMAScript中还能使用仿函数或匿名函数。仿函数(functor),就是使一个类的使用看上去像一个函数。其实现是类中实现一个operator(),这个类有了类似函数的行为,就是一个仿函数类。

回调函数

回调函数就是一个被作为参数传递的函数。在C语言中,回调函数只能使用函数指针实现,在C++、Python、ECMAScript等更现代的编程语言中还可以使用仿函数或匿名函数。

回调函数的使用可以大大提升编程的效率,这使得它在现代编程中被非常多地使用。同时,有一些需求必须要使用回调函数来实现。

非常知名的回调函数调用有C/C++标准库stdlib.h/cstdlib中的快速排序函数qsort和二分查找函数bsearch中都会要求的一个与strcmp类似的参数,用于设置数据的比较方法。

回调函数在实际中有许多作用。假设有这样一种情况:我们要编写一个库,它提供了某些排序算法的实现(如冒泡排序、快速排序、shell排序、shake排序等等),为了能让库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,能让库可用于多种数据类型(int、float、string),此时,可以使用函数指针,并进行回调。

仿函数

仿函数(functor),就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。

有时仿函数的使用是为了函数拥有类的性质,以达到安全传递函数指针,依据函数生成对象,甚至是让函数之间有继承关系,对函数进行运算和操作的效果。比如set就使用了仿函数less ,而less继承的binary_function,就可以看作是对于一类函数的总体声明了,这是函数做不到的。

仿函数还给出了static的替代方案,函数内的静态变量可以改成类的私有成员,这样可以明确地在析构函数中清除所用的内容,如果用到了指针,那么这个是不错的选择。有人说这样的类已经不是仿函数了,但其实,封装后从外界观察,可以明显地发现,它依然有函数的性质。

延伸阅读:

什么是计算机函数?

计算机的函数,是一个固定的一个程序段,或称其为一个子程序,它在可以实现固定运算功能的同时,还带有一个入口和一个出口,所谓的入口,就是函数所带的各个参数,我们可以通过这个入口,把函数的参数值代入子程序,供计算机处理;所谓出口,就是指函数的函数值,在计算机求得之后,由此口带回给调用它的程序。

文章标题:回调函数,仿函数(functor)的区别及各自应用场景,发布者:小编,转载请注明出处:https://worktile.com/kb/p/38887

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年2月20日 上午12:44
下一篇 2023年2月20日 上午12:45

相关推荐

  • 有什么好的模型可以做高精度的时间序列预测

    针对时间序列预测,以下模型表现尤为突出:1、ARIMA;2、Prophet;3、LSTM神经网络;4、Transformer模型;5、泰森模型(Theta);6、Exponential Smoothing State Space Model(ETS)。其中,ARIMA模型因其结合了自回归(AR)和移…

    2023年7月23日
    6200
  • 数字声音编码都有哪些方面

    数字声音编码有:1、波形编码法;2、参数编码法;3、混合编码法。波形编码是对声音波形进行采样、量化和编码。常用的波形编码方法是PCM(脉冲编码调制)、DPCM(差值脉冲编码调制)和ADPCM(自适应差值编码调制)。 1、波形编码法 波形编码是对声音波形进行采样、量化和编码。在信号采样和量化过程中,考…

    2023年1月10日
    25900
  • 项目的所有分解目标是

    项目的所有分解目标分别是:一、确定项目的范围;二、制定项目计划;三、定义项目团队;四、制定沟通计划;五、管理项目风险;六、监控和控制项目。第一个分解目标是确定项目的范围。这意味着明确项目的目标、可交付成果、约束因素和假设条件。 一、确定项目的范围 第一个分解目标是确定项目的范围。这意味着明确项目的目…

    2023年4月27日
    8000
  • 什么是HttpMaster Pro

    什么是HttpMaster Pro:它被描述为 Web 开发人员的有用工具,他们基本上需要通过从预定网站中请求大量工具来自动化 Internet 应用程序以及测试过程。对于需要高级测试软件的熟练程序员来说,这是一种非常自然的方式,他们在这种情况下谈论网站甚至互联网程序的应用程序。 一、什么是Http…

    2023年5月9日
    3300
  • 手机APP线上开发和线下开发的区别

    手机APP线上开发和线下开发的区别是:1、开发环境;2、资源需求;3、开发速度;4、团队协作;5、数据安全性;6、适应性。在现代技术环境中,手机APP开发已经成为了一个炙手可热的领域。然而,开发方法的选择在很大程度上影响了APP的设计、实施和维护。 1、开发环境 线上开发:主要在云端进行,通过浏览器…

    2023年7月31日
    4800
  • 开发APP软件有什么用

    开发APP软件的作用是:一、提高企业和品牌的可见性;二、帮助企业获取新客户;三、增加用户互动;四、改善客户体验;五、提高销售效率。企业可以通过APP在不同的移动平台上推广品牌,提高品牌知名度。APP可以为消费者提供清晰的产品或服务信息和品牌文化。 一、提高企业和品牌的可见性 企业可以通过APP在不同…

    2023年5月28日
    3800
  • Bps、bps的B和b究竟是否应严格区别

    Bps、bps的B和b需要严格区别,原因有:1、本质不同;2、概念不同。本质不同是指Bps是指“每秒字节”,其中的B是大写,代表的是“Byte”(字节)的单位,而bps则是指“每秒比特”,其中的b是小写,代表的是“bit”(比特)的单位。 一、Bps、bps的B和b的区别 1、本质不同 Bps:Bp…

    2023年4月2日
    31100
  • 知识库构建方法是什么

    知识库构建方法包括以下几个步骤:1、界定核心知识;2、控制知识产出;3、知识内容的组织;4、知识的利用;5、知识的创新应用。知识库是基于知识且具有智能性的系统(或专家系统)。 一、界定核心知识 在任何一个企业内部,都有各种各样的知识,而在知识管理的实践中,并非所有知识都需要管理。在时间和资源有限的情…

    2022年11月16日
    69601
  • 强类型语言的优缺点是什么

    强类型语言的优点是编译时刻能检查出错误的类型匹配,以提高程序的安全性;可以根据对象类型优化相应运算,以提高目标代码的质量;减少运行时刻的开销。强类型语言真正的缺点永远就是原生类型不够多。 强类型指的是程序中表达的任何对象所从属的类型都必须能在编译时刻确定。常见的强类型语言有Java、Apex和Pyt…

    2023年2月22日
    15100
  • SQLite的select效率为什么不受表的大小影响

    原因有:一、SQLite的存储方式;二、SQLite的查询优化;三、SQLite的索引机制;四、SQLite的缓存机制;五、SQLite的逐行查询方式;六、SQLite的线程安全性。SQLite采用了一种特殊的存储方式,将整个数据库作为一个文件保存在磁盘上。而且,每个表也都是作为一个文件存储的。 一…

    2023年5月31日
    10300

发表回复

登录后才能评论
联系我们
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部