详细讲解C++的可调用对象

详细讲解C++的可调用对象

在C++中,存在“可调用对象(Callable Obiects)这么一个概念。准确来说,可调用对象有如下几种定义:

  • 是一个函数指针

  • 是一个具有 operator() 成员函数的类对象(仿函数)

  • 是一个可被转换为函数指针的类对象

  • 是一个类成员(函数)指针

它们在程序中的应用如下所示:

void func(void)
{//...
}struct Foo
{void operator() (void){//...}
};struct Bar
{using fr_t = void(*)(void);static void func(void){//...}operator fr_t(void){return func;}
};struct A
{int a_;void mem_func(void){//...}
};int main(void)
{void(* func_ptr)(void) = &func; //1. 数指针func_ptr();Foo foo;    //2. 仿函数foo();Bar bar;    //3. 可被转换为函数指针的类对象bar();void (A::*mem_func_ptr)(void)      //4. 类成员函数指针= &A::mem_func;intA::*mem_obj_ptr   //或者是类成员指针= &A::a_;A aa;(aa.*mem_func_ptr)();aa.*mem_obj_ptr = 123;return 0;
}

从上述可以看到,除了类成员指针之外,上面定义涉及的对象均可以像一个函数那样做调用操作。

在 C++11中,像上面例子中的这些对象(func_ptr、foo、bar、mem_func_ptr、mem_obj_ptr)都被称做可调用对象。相对应的,这些

对象的类型被统称为 “可调用类型” 细心的读者可能会发现,上面对可调用类型的定义里并没有包括函数类型或者函数引用(只有函数指

针)。这是因为函数类型并不能直接用来定义对象;而函数引用从某种意义上来说,可以看做一个const 的函数指针。

C++ 中的可调用对象虽然具有比较统一的操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法五花八门。这样在我

们试图使用统一的方式保存,或传递一个可调用对象时,会十分烦琐。

现在,C++11通过提供 std::functionstd::bind 统一了可调用对象的各种操作。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器

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

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

相关文章

rollup打包js库 占位符替换成文件名和行号输出日志中定位报错位置

rollup 自定义插件进行代码替换 简易版问题:在打包的js库中有很多日志或者error的控制台输出,但是打包后的js调用报错后无法从控制台看到堆栈信息,无法定位报错的位置是在哪个文件的哪一行需求:能够从报错中观察到报错在哪个文件的…

力扣206. 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]示例 3: 输入&am…

MySQL进阶

目录 一、存储引擎 1、MySQL体系结构 2、存储引擎简介 3、存储引擎特点 InnoDB MyISAM Memory 4、存储引擎选择 二、索引 1、索引概述 2、索引结构 3、索引分类 4、索引语法 5、SQL性能分析 5.1 SQL执行频率 5.2 慢查询日志 5.3 profile详情 5.4 explain执行…

k8s dev环境怎么做到本地调试

列出所有的namespace kubens切换到指定的namespace kubens dev-gmmt 查看namespace 中存在那些service kubectl get services启动链接的服务和端口 kubectl port-forward service/cmdb 8081:8081该命令的含义是将Kubernetes集群中名为"cmdb"的服务的端口8081&…

Spring-Cloud-Gateway如何自定义断言工厂?

遇到这么一个面试题:如何在网关做配置,实现只有在早晨9点到下午18点之间接口才允许访问,其他时间访问都是404。 我们知道网关的一个重要的作用就是路由转发,路由表的配置大概是这个样子: spring:cloud:gateway:routes:- id: user…

Sentinel流量规则模块(新增)

系统并发能力有限,比如系统A的QPS支持1个请求,如果太多请求过来,那么系统A就应该进行流量控制了,比如其他请求直接拒绝 新增流控规则介绍:新增流控规则窗口 1.资源名:默认请求路径。 2.针对来源:Se…

基于51单片机和proteus的温室大棚系统

此系统是基于51单片机和proteus的仿真设计,功能如下: 1. LCD1602实时显示光照/土壤湿度/温度值及设定值。 2. 按键可增减光照/土壤湿度/温度设定阈值。 3. 获取到的温度低于设定温度则打开加热设备。 4. 获取到的光照值低于设定光照值则打开补光灯。…

【SpringBoot Web开发】如何构建树形结构数据

树形结构数据 应用场景 比如我们需要构建菜单、机构树、其他业务类型树形结构 工具类 我们可以把菜单列表返回,获取parent_id字段等于0的节点,称为根节点,这样的节点代表一级菜单再通过根节点的主键去寻找子菜单,因为要有多及菜…

【iOS】编译与链接

前言 计算机语言分为机器语言、汇编语言和高级语言。 可以将高级语言分为两种:编译语言和解释型语言(直译式语言)。 解释型语言(逐步进行解释执行) 解释语言编写的程序在每次运行时都需要通过解释器对程序进行动态…

【区块链+体育】“数智化”的杭州亚运会,中创助力区块链技术发展

“智能”,是杭州亚运会的办赛理念之一。除了数字藏品开亚运先河,杭州亚组委充分应用区块链、大数据、人工智能等前沿技术,为观众提供从购票、出行、观赛到住宿、美食和旅游等“一站式”服务。 本次亚运会将全程智能陆续落到了实处&#xff0…

CSS 实现 Turbo 官网 3D 网格线背景动画

转载请注明出处,点击此处 查看更多精彩内容 查看 Turbo 官网 时发现它的背景动画挺有意思,就自己动手实现了一下。下面对关键点进行解释说明,查看完整代码及预览效果请 点击这里。 简单说明原理:使用 mask-image 遮罩绘制网格&a…

Python测试框架Pytest的基础入门

Pytest简介 Pytest is a mature full-featured Python testing tool that helps you write better programs.The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries. 通过官方网站介绍…

ios 通过xib自定义控件

通过xib自定义控件 xib和stroyboayd对比 共同点: 都是用来描述软件界面 都是用interface Builder工具来编辑 本质都是转换成代码去创建控件 不同点: xib是轻量级的,用来描述局部ui界面 创建模型文件 XMGCar 自定义控件 xib 图形设计 …

graylog源码搭建

这里主要讲如何源码安装graylog 下载地址: https://www.graylog.org/downloads/ 下载带有JVM的源码文件源码安装 下载graylog-5.1.3-linux-x64.tgz,并上传到Centos中,执行以下操作 tar -zxvf graylog-5.1.3-linux-x64.tgzcd /etcmkdir -p …

每天一道C语言编程:Cylinder(圆柱体问题)

题目描述 使用一张纸和剪刀,您可以通过以下方式切出两个面形成一个圆柱体: 水平切割纸张(平行于较短的边)以获得两个矩形部分。 从第一部分开始,切出一个最大半径的圆。圆圈将形成圆柱体的底部。 将第二部分向上滚动&…

在 Amazon 上以高可用性模式实现 Microsoft SQL 数据库服务现代化的注意事项

许多企业都有需要 Microsoft SQL Server 来运行关系数据库工作负载的应用程序:一些应用程序可能是专有软件,供应商可使用它强制 Microsoft SQL Server 运行数据库服务;其他应用程序可能是长期存在的、自主开发的应用程序,它们在最…

我们如何在 Elasticsearch 8.6、8.7 和 8.8 中加速数据摄入

作者:Adrien Grand, Joe Gallo, Tyler Perkins 正如你们中的一些人已经注意到的,Elasticsearch 8.6、8.7 和 8.8 在各种数据集上带来了良好的索引加速,从简单的关键字到繁重的 KNN 向量,以及摄取管道繁重的摄取工作负载。 摄取涉及…

跳跃表SkipList(简单的C++实现)

不懂跳跃表的请直接百度 直接上实现 #include <iostream> #include <string.h> #include <ctime>using namespace std;template<typename T> struct SkipNode {inline static constexpr int Rate3;inline static constexpr int MaxHeight8;inline sta…

2023版7月软件测试面试题(800道)【附带答案】持续更新...

又到了立flag的时候&#xff0c;你的目标是拿下大厂offer&#xff1f;还是多少万年薪&#xff1f;其实这些都离不开日积月累的过程。 为此我特意整理出一份&#xff08;超详细笔记/面试题&#xff09;它几乎涵盖了所有的测试开发技术栈&#xff0c;非常珍贵&#xff0c;人手一…

批量添加:vue+easyexcel 上传excel文件解析为Java对象并保存到数据库

对于像数据库中批量添加数据&#xff0c;我们一般会选择通过Excel文件先按照固定的格式将数据保存&#xff0c;然后再通过系统上传进而保存到数据库中。 阿里的excel解析工具EasyExcel和Apach的POI都能进行Excel文件的解析&#xff0c;但是EasyExcel操作起来要相对更简单一些&…