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

news2024/7/4 3:11:49

目录

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;
	else
		return 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.coloradmin.cn/o/1884049.html

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

相关文章

JavaFX布局-BorderPane

JavaFX布局-BorderPane 实现方式Java实现FXML实现 综合案例 将容器空间分成五个区域&#xff1a;顶部&#xff08;Top&#xff09;、底部&#xff08;Bottom&#xff09;、左侧&#xff08;Left&#xff09;、右侧&#xff08;Right&#xff09;和中心&#xff08;Center&#…

专题六:Spring源码之初始化容器BeanFactory

上一篇咱们通过一个例子介绍初始化容器上下文相关内容&#xff0c;并通过两个示例代码看到了Spring在设计阶段为我预留的扩展点&#xff0c;和我们应该如何利用这两个扩展点在Spring初始化容器上下文阶段为我们提供服务。这一篇咱们接着往下看。 老这样子下回到refresh方法上来…

OFDM关键技术——同步技术

同一符号内各子载波受到不同的相位偏转及幅度衰减&#xff0c; k 越大偏差越大&#xff1b;相位偏转与子载波序号 k 和符号序号 i 均有关&#xff0c;序号越大&#xff0c;相位偏转越大&#xff1b;引入了 ICI &#xff0c;系统信噪比降低&#xff1b;当采样偏差效果累积到一定…

苍穹外卖项目 常用注解 + 动态sql

常用注解 常见的注解解析方法有两种&#xff1a; 编译期直接扫描&#xff1a;编译器在编译 Java 代码的时候扫描对应的注解并处理&#xff0c;比如某个方法使用Override 注解&#xff0c;编译器在编译的时候就会检测当前的方法是否重写了父类对应的方法。运行期通过反射处理&…

CesiumJS【Basic】- #038 绘制轮廓线(Primitive方式)

文章目录 绘制轮廓线(Primitive方式)1 目标2 代码2.1 main.ts绘制轮廓线(Primitive方式) 1 目标 使用Primitive方式绘制轮廓线 2 代码 2.1 main.ts var start = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883);v

设备通信-MODBUS协议和485接口

因水表远程监控和水泵数据监控系统&#xff0c;需了解物联网开发协议。 通信协议 通信协议说白了就是一种语言&#xff0c;一种通信双方都能听的懂得语言。 设备常用的通信协议有MODBUS RTU&#xff0c;PPI,MPI等&#xff0c;通信协议和我们常用的语言只是叫法不一样&#x…

预约小程序源码,云开发技术,无需服务器

介绍&#xff1a; 很多企业的业务都需要通过服务预约来完成&#xff0c;比如酒店、美容、家政等等。 但很多商家因缺少合适的服务预订工具&#xff0c;而不知道如何让客户尽快预约。 这种情况下&#xff0c;制作一个自己的预约小程序&#xff0c;客户只需要扫码或者在微信里…

8605 删数问题

这是一个典型的贪心算法问题。我们可以从高位开始&#xff0c;找到第一个比后面数字大的数字&#xff0c;删除它&#xff0c;然后继续这个过程&#xff0c;直到删除k个数字。如果我们已经删除了k个数字&#xff0c;但是还没有找到一个比后面数字大的数字&#xff0c;那么我们就…

51-1 内网信息收集 - 内网资源探测

导语 在内网渗透过程中,通常需要利用各种技术来探测内网资源,为后续的横向渗透做准备。发现内网存活的主机及其详细信息可以帮助确定攻击方向和潜在的漏洞。 一、基于 ICMP 发现存活主机 ICMP(Internet Control Message Protocol,因特网控制消息协议)是 TCP/IP 协议簇的…

Vue2动态代理,换服务无须重启项目

1、痛点 当我们需要使用不同的服务器时&#xff0c;就需要手动修改vue.config.js中配置并重新启动项目。当项目越来越大时&#xff0c;会需要较长的时间来等待项目启动&#xff0c;如此反复&#xff0c;极大影响我们开发进度。 2、寻求解决方案 vue-cli 的代理是使用的http-p…

详解归一化、标准化、正则化以及batch normalization

文章目录 what(是什么)where&#xff08;用在哪&#xff09;How&#xff08;如何用&&原理&#xff09;归一化实现方式原理示例说明 标准化实现方式原理示例说明 正则化实现方式原理作用 Batch Normalizationpytorch中的batch normalization原理BN的作用 归一化、标准化…

Python 文件操作

文件编码 将文件的内容翻译为二进制 文件操作 打开文件 open函数 语法&#xff1a; open(name, mode, encoding)name&#xff1a;文件名的字符串&#xff0c;可以包含具体路径。若没有路径&#xff0c;则默认为与py文件位于同一层 mode&#xff1a;打开文件的模式&#xf…

tkinter实现进度条

tkinter实现进度条 效果代码解析导入需要的模块定义进度条 代码 效果 代码解析 导入需要的模块 import tkinter as tk from tkinter import ttk定义进度条 def start_progress():progress[value] 0max_value 100step 10for i in range(0, max_value, step):progress[valu…

职场新宠“禁止蕉绿”:解压新方式,健康新态度

近期&#xff0c;一种名为“禁止蕉绿”的带杆香蕉在职场人群中悄然走红&#xff0c;成为他们工位上的新宠。这一现象源于“蕉绿”与“焦虑”的谐音&#xff0c;寓意着职场人对远离焦虑、追求心理放松的渴望。在社交平台上&#xff0c;种植水培果蔬如香蕉、菠萝等已成为职场话题…

一文带您了解Fiddler的家族产品:Fiddler Classic、FiddlerCore、Fiddler和Cap、Fiddler Jam

最近更新了一下Fiddler&#xff08;好久没更新了&#xff09;&#xff0c;然后浏览了一下官方网站&#xff0c;发现fillder的变化还是蛮大的&#xff0c;新出了好多产品&#xff0c;在这里我就把这些产品进行汇总比较&#xff0c;便于大家快速了解&#xff0c;快速选择自己需要…

为什么网络爬虫广泛使用HTTP代理?

一、引言 网络爬虫作为自动抓取互联网信息的重要工具&#xff0c;在现代社会中发挥着不可或缺的作用。然而随着网络环境的日益复杂&#xff0c;网站反爬虫技术的不断进步&#xff0c;网络爬虫在获取数据的过程中面临着越来越多的挑战。为了应对这些挑战&#xff0c;HTTP 代理成…

复制 pdf 的表格到 markdown 版本的Typora 或者 word 中

在 pdf 中选中复制表格内容&#xff0c;直接粘贴到 typora 中失败&#xff0c;可以使用 txt文件和 excel 做过渡。 准备一个空的 txt 文件&#xff0c;将 pdf 中表格的数据复制粘贴到txt文件中&#xff0c;文本内容会以空格分开&#xff0c;如下图的形式&#xff1a; 打开 exc…

【Excel、RStudio计算T检测的具体操作步骤】

目录 一、基础知识1.1 显著性检验1.2 等方差T检验、异方差T检验1.3 单尾p、双尾p1.3.1 检验目的不同1.3.2 用法不同1.3.3 如何选择 二、Excel2.1 统计分析工具2.1.1 添加统计分析工具2.1.2 数据分析 2.2 公式 -> 插入函数 -> T.TEST 三、RStudio 一、基础知识 参考: 1.…

Spring底层原理之bean的加载方式四 @import 注解

bean的加载方式四 import 第四种bean的导入方式 是import导入的方式 在配置类上面加上注解就行 package com.bigdata1421.config;import com.bigdata1421.bean.Dog; import org.springframework.context.annotation.Import;Import(Dog.class) public class SpringConfig4 {…

直播的js代码debug解析找到protobuf消息的定义

我们都知道直播的弹幕消息是通过websocket发送的&#xff0c;而且是通过protobuf传输的&#xff0c;那么这里面传输了哪些内容&#xff0c;这个proto文件又要怎么定义&#xff1f;每个消息叫什么&#xff0c;消息里面又包含有哪些字段&#xff0c;每个字段又是什么类型&#xf…