C++类型转换可调用对象

目录

C++的四种可视性类型转换

1.static_cast

2.reinterpret_cast

3.const_cast

4.dynamic_cast

C++中的可调用对象

普通函数

函数指针

仿函数

Lambda表达式

包装器function

bind


C++的四种可视性类型转换

C语言中的类型转换是不安全、不明确的,于是C++就出了更加安全,可视化的类型转换。

1.static_cast

static_cast是用于C语言中可以隐式类型转换的类型之间,当编译器隐式执行类型转换时,大多数编译器会给出警告该操作会损失精度,而采用static_cast可以明确告诉编译器,这是知情的情况下进行的。

使用static_cast

2.reinterpret_cast

reinterpret_cast用于C语言中某些不能隐式类型转换的类型之间,例如:不同指针类型之间

使用reinterpret_cast

3.const_cast

const_cast用于const指针、引用->非const指针、引用之间的转换

4.dynamic_cast

dynamic_cast是用于父类到子类之间指针、引用的转换。默认子类对象、指针、引用可以赋值给父类(切片)

下面的情况就可以父类指针、引用赋值给子类指针、引用

改为:

这里使用了C语言中不同指针类型的强制类型转换,本质是对指针可以访问空间大小的改变

上面的例子中,Person* -> Student*的原因是它本来就是指向的一个Student,于是就可以从父类指针再回到子类指针。但是如果原本父类指针只是指向父类对象,强转访问会造成越界!

C++中使用dynamic_cast进行安全的向下转型,如果转型失败会返回nullptr。从而有效避免越界。

C++中的可调用对象

普通函数

int a = 10, b = 20;
func(a, b);//普通函数

函数指针

int (*func_ptr)(int, int)=func;//函数指针
func_ptr(10, 20);

仿函数

class Func
{
public:int operator()(int a, int b){return a + b;}
};
int main()
{Func f;//仿函数f(10, 20);return 0;
}

Lambda表达式

//lambda表达式 [] 捕获列表 ()参数列表 ->返回类型
auto flam=[](int a, int b)->int {return a + b;};
flam(10, 20);

包装器function

包装器是C++的一个模板类,可以将任何可调用对象赋值给包装器对象,常用于业务逻辑的注册。

//使用包装器可以将任何可调用对象赋值给包装器
function<int(int, int)> fun1 = func;
function<int(int, int)> fun2=func_ptr;
function<int(int, int)> fun3 = f;
function<int(int, int)> fun4 = flam;

包装器玩法:

#include<functional>
#include<unordered_map>
int Add(int a, int b)
{return a + b;
}
int Sub(int a, int b)
{return a - b;
}
int Mul(int a, int b)
{return a * b;
}
int Div(int a, int b)
{if (b != 0)return a / b;elsereturn 0;
}
int main()
{unordered_map<string, function<int(int, int)>> business;//存储业务逻辑business["+"] = Add;//将业务添加到business中business["-"] = Sub;business["*"] = Mul;business["/"] = Div;cout << business["+"](2, 3) << endl;//调用指定业务逻辑return 0;
}

bind

bind就像一个可调用对象适配器,通过接收一个可调用对象,生成一个新的可调用对象。

新的可调用对象可以原来的形参列表进行调整。

直接举例示范:

甚至可以使参数在实际传入时调换顺序

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

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

相关文章

MQTT QoS 0, 1, 2

目录 # 开篇 1. 精细MQS TT QoS的行为 1.1 QoS 0: 最多交付一次&#xff08;At Most Once&#xff09; 1.2 QoS 1: 至少交付一次&#xff08;At Least Once&#xff09; 1.3 QoS 2: 只交付一次&#xff08;Exactly Once&#xff09; 1.4 传输过程图示 1.5 总结 2. MQTT…

HTTP协议头中X-Forwarded-For是能做什么?

X-Forwarded-For和相关几个头部的理解 $remote_addr 是nginx与客户端进行TCP连接过程中&#xff0c;获得的客户端真实地址. Remote Address 无法伪造&#xff0c;因为建立 TCP 连接需要三次握手&#xff0c;如果伪造了源 IP&#xff0c;无法建立 TCP 连接&#xff0c;更不会有后…

javascript 的 属性、方法、事件

使用 javascript 设计一个学生类、&#xff08;属性&#xff1a;ID、姓名、性别,方法&#xff1a;学习、休息、&#xff0c;事件&#xff1a;上学、放学、上课、下课&#xff09;学校有定时器每1秒钟触发一次时钟事件&#xff0c;每节课45分钟&#xff0c;课间15分钟 var Stud…

13. Lammps入门in文件简介-1

来源&#xff1a; “码农不会写诗”公众号 链接&#xff1a;Lammps入门in文件简介-1 文章目录 01 in文件简介02 in文件命令解析规则 书回正文 Lammps通过一次一行地从输入脚本&#xff08;文本文件&#xff0c;通常称in文件&#xff09;中读取命令来执行计算&#xff0c;当输入…

7-1作业

1.实验目的&#xff1a;完成字符收发 led.h #ifndef __GPIO_H__ #define __GPIO_H__#include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h"//RCC,GPIO,UART初始化 void init();//字符数据发送 void set_tt…

Web端登录页和注册页源码

前言&#xff1a;登录页面是前端开发中最常见的页面&#xff0c;下面是登录页面效果图和源代码&#xff0c;CV大法直接拿走。 1、登录页面 源代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>登录</ti…

Django 和 Django REST framework 创建对外 API

1. 环境准备 确保你已经安装了 Python 和 Django。如果尚未安装 Django REST framework&#xff0c;通过 pip 安装它&#xff1a; pip install djangorestframework 2. 创建 Django 项目 如果你还没有 Django 项目&#xff0c;可以通过以下命令创建&#xff1a; django-ad…

每日复盘-20240701

今日关注&#xff1a; 20240701 六日涨幅最大: ------1--------301182--------- 凯旺科技 五日涨幅最大: ------1--------300977--------- 深圳瑞捷 四日涨幅最大: ------1--------300977--------- 深圳瑞捷 三日涨幅最大: ------1--------300461--------- 田中精机 二日涨幅最…

Lua实现链表(面向对象应用)

Lua实现面向对象 面向对象核心三要素Lua面向对象大致原理面向对象示例继承与多态示例 面向对象核心三要素 1.封装&#xff1a;对一个事物的抽象为一些属性和行为动作的集合&#xff0c;封装将属性和行为动作&#xff08;操作数据的方法&#xff09;绑定在一起&#xff0c;并隐藏…

快钱支付股东全部股权已被质押!

根据近期工商信息&#xff0c;第三方支付机构快钱支付清算信息有限公司&#xff08;简称“快钱支付”&#xff09;实际控股方快钱金融服务&#xff08;上海&#xff09;有限公司&#xff08;简称“快钱金融”&#xff09;&#xff0c;作为出质股权标的企业&#xff0c;被出质给…

【SGX系列教程】(三)Intel-SGX 官方示例分析(SampleCode)——SampleEnclave

文章目录 一. 引言二. README2.1 项目目的2.2 构建和执行示例代码的步骤2.3 配置参数解释2.4 配置文件分析2.5 启动令牌初始化 三. 重点代码分析3.1 App文件夹3.1.1 App/App.cpp3.1.2 App/Edger8rSyntax文件夹3.1.2.1 App/Edger8rSyntax/Arrays.cpp3.1.2.2 App/Edger8rSyntax/F…

一文全概括,建议收藏,那些你不可错过的IC设计书籍合集(可下载)

集成电路设计工程师的角色不仅是推动技术创新的中坚力量&#xff0c;更是实现产品从概念到现实的关键桥梁。随着对高性能、低功耗芯片的需求不断增长&#xff0c;IC设计工程师的专业技能和知识深度成为了衡量其职业价值的重要标准。无论是在数字逻辑设计、功能验证、可测试性设…

JMeter--定时执行的方法

原文网址&#xff1a;JMeter--定时执行的方法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍JMeter如何使用定时器定时执行测试任务。 Java技术星球&#xff1a;way2j.com 方法 第一步&#xff1a;新建定时器 右键测试任务> Add > Timer> Constant Timer 如下图所示…

qt中数据库和excel互导数据————附带详细步骤和代码

文章目录 0 背景1 准备QXlsx环境1.1 cmake安装使用1.2 qmake使用 2 把excel数据导出到mysql数据库3 把mysql数据库的数据写入到excel4 完整代码5 项目代码仓库 0 背景 因为需要批量导入和导出数据&#xff0c;所以需要用到excel。实现把数据库的数据导入到excel中&#xff0c;…

圆圈序号1~10复制粘贴直接用

1. 空心圆圈数字序号&#xff1a; ①、②、③、④、⑤、⑥、⑦、⑧、⑨、⑩ 2. 实心圆圈数字序号&#xff1a; ❶、❷、❸、❹、❺、❻、❼、❽、❾、❿ 3. 空心圆圈中文序号&#xff1a; ㊀、㊁、㊂、㊃、㊄、㊅、㊆、㊇、㊈、㊉

linux高级编程(线程)(1)

虚拟地址&#xff1a; 线程&#xff1a; 概念&#xff1a;线程是轻量级进程&#xff0c;一般是一个进程中的多个任务。 进程是系统中最小的资源分配单位。&#xff08;竞争计算机资源的最小单位&#xff09;&#xff08;进程能分配硬件资源&#xff0c;线程不行&#x…

解析QAnything启动命令过程

一.启动命令过程日志 启动命令bash ./run.sh -c local -i 0 -b hf -m Qwen-1_8B-Chat -t qwen-7b-chat。输入日志如下所示&#xff1a; rootMM-202203161213:/mnt/l/20230918_RAG方向/QAnything# bash ./run.sh -c local -i 0 -b hf -m Qwen-1_8B-Chat -t qwen-7b-chat From …

Leetcode Java学习记录——栈和队列 IDEA

文章目录 栈和队列stack Classqueue InterfaceDeque Interfaceadd 和 push Priority Queue -- Class题目 codestyleIDEA 操作快捷键选择代码生成类 栈和队列 stack Class google stack java 8/12 empty() peek() pop() push(E item) search(Object o) 最近相关性会用到栈 …

湘潭大学软件工程数据库总结

文章目录 前言试卷结构给学弟学妹的一些参考自己的一些总结 前言 自己可能很早很早之前就准备复习了&#xff0c;但是感觉还是没有学到要点&#xff0c;主要还是没啥紧迫的压力&#xff0c;我们是三月份开学&#xff0c;那时候实验室有朋友挺认真开始学习数据库了&#xff0c;…

理性决策的艺术:从购房到择偶的数学智慧;37% 规则,做出最佳决策的秘诀;用数学模型解决人生难题

在面对人生重大决策时&#xff0c;如购房或择偶&#xff0c;我们常常感到迷茫和困惑。然而&#xff0c;如果我们能够将这些看似复杂的问题简化为数学模型&#xff0c;我们就能以更加理性和系统的方式做出决策。 37%规则 1950年代&#xff0c;当时几位数学家开始研究这样一个问…