C++ “万能血“ void*指针
本篇文章我们来介绍一下C++ “万能血” void指针
为什么说他万能呢?
原因:C++ void*是一种特殊的指针类型,可用于存放任意对象的地址。在函数传参中也可以作为任何实参的形参
void型详细介绍
void*是C++中的一种特殊的指针类型,被称为"无类型指针"。它可以指向任意类型的数据,但在没有进行类型转换之前,不能直接对其进行解引用操作。由于
void*是一个无类型指针,因此它可以用来实现泛型编程或处理未知数据类型的情况。例如,在某些情况下,需要将指针作为参数传递给函数,并且不确定具体的数据类型时,可以使用void*类型。然而,由于
void*是无类型指针,所以在使用它时需要注意类型安全性。如果要在void*指针上执行操作或访问其内容,必须先将其转换回原始类型。
下面我们来看一下代码实例:
int number = 42;
void* ptr = &number; // 将 int 类型的指针赋值给 void*
int* intPtr = static_cast<int*>(ptr); // 将 void* 转换回 int*
std::cout << *intPtr << std::endl; // 解引用 void* 转换后的指针
注意要进行类型转换
万能指针在C++中的应用
“万能“喝“泛型”这两个词语 相信大家第一眼看出来就是有很大关联的
在这里先介绍一下C++泛型编程
泛型编程是一种程序设计方法,旨在编写通用、可重用的代码,以处理不同类型的数据,而无需为每个具体类型都创建专门的代码。它使得程序员能够编写与数据类型无关的算法和数据结构,从而提高代码的灵活性和可维护性。
通过使用泛型编程技术,可以将算法或数据结构与特定类型解耦,使其适用于各种不同的数据类型。这种解耦是通过参数化实现的,即在定义函数或类时使用参数来表示待处理的类型。
C++中的模板是实现泛型编程的主要机制之一。通过使用函数模板或类模板,在定义时指定一个或多个类型参数,并在使用时根据需要进行实例化。这样一来,相同的代码可以适用于不同的数据类型。
泛型编程带来了许多优点,包括:
- 代码复用:可以编写一次通用代码,在多个地方重复使用。
- 类型安全:在编译时进行类型检查,避免了运行时出现类型错误。
- 性能优化:由于生成具体化版本时会进行静态展开和优化,因此可以获得与手动针对特定类型优化相似甚至更好的性能。
- 可扩展性:当需要处理新类型时,只需提供适当的类型参数,而无需修改现有的泛型代码。
总而言之,泛型编程使得程序员能够更加灵活地处理不同类型的数据,并且可以提高代码的可维护性和重用性。
泛型和万能结合的代码实例:
#include <iostream>// 泛型打印函数
void printValue(void* ptr, const std::string& type) {if (type == "int") {int* intValue = static_cast<int*>(ptr);std::cout << "Value: " << *intValue << std::endl;} else if (type == "double") {double* doubleValue = static_cast<double*>(ptr);std::cout << "Value: " << *doubleValue << std::endl;} else if (type == "char") {char* charValue = static_cast<char*>(ptr);std::cout << "Value: " << *charValue << std::endl;} else {std::cout << "Unsupported type" << std::endl;}
}int main() {int intValue = 42;double doubleValue = 3.14;char charValue = 'A';printValue(&intValue, "int");printValue(&doubleValue, "double");printValue(&charValue, "char");return 0;
}
在上述示例中,通过使用
void*类型的指针作为参数,我们可以根据不同的类型进行数据打印操作。这样就实现了一种简单的泛型功能。需要注意的是,在使用
void*进行泛型编程时,需要小心处理类型转换和指针解引用等操作,以确保类型安全性和正确性。注意:void*万能指针的解引用通常与C++static_cast<T>相结合使用
拓展: C++ void*和C++模板元编程互相使用
C++模板元编程意思通俗的来说就是编译的时候就执行出结果 而不是运行或者说不需要运行就可以出结果了
代码实例:
#include <iostream>// 使用 void* 实现的通用 Swap 函数
void Swap(void* a, void* b, size_t size) {char* first = static_cast<char*>(a);char* second = static_cast<char*>(b);while (size--) {char temp = *first;*first++ = *second;*second++ = temp;}
}// 使用模板元编程实现的通用 Swap 函数
template <typename T>
void TemplateSwap(T& a, T& b) {T temp = a;a = b;b = temp;
}int main() {// 使用 void* 的通用 Swap 示例int x = 5, y = 10;std::cout << "Before swap: x=" << x << ", y=" << y << std::endl;Swap(&x, &y, sizeof(int));std::cout << "After swap using void*: x=" << x << ", y=" << y << std::endl;// 使用模板元编程的通用 Swap 示例double p = 2.5, q = 3.7;std::cout << "Before swap: p=" << p << ", q=" << q << std::endl;TemplateSwap(p, q);std::cout << "After swap using templates: p=" << p << ", q=" << q<< std::endl;return 0;
}
在上述代码中,我们首先定义了一个使用
void*实现的通用Swap函数,它接受两个void*类型的指针和一个表示数据大小的参数。在函数内部,我们将指针转换为char*类型,并使用循环逐字节交换数据。然后,定义了一个使用模板元编程实现的通用
Swap函数TemplateSwap,它接受两个模板类型的引用。在函数内部,我们通过创建临时变量并交换值来实现泛型交换操作。在主函数中,我们分别演示了使用
void*和模板元编程实现的通用Swap函数。可以看到,在使用这两种方法时,不需要关心具体类型,只需传入相应的参数即可完成值的交换。需要注意的是,虽然使用
void*可以实现一定程度上的泛型功能,但由于类型擦除和显式转换等问题,可能存在类型安全性和性能损失。而模板元编程则在编译期间进行类型检查和优化,并提供更好的类型安全性和效率。
最后 C++ void* 在C++24 里面变化不大 modern effective C++ 里面侧重的就是万能和模板的使用
总结: C++里面每一个知识点都对应着一个目的 并且C++是一个不断追求完美的语言 C++三大特性 封装 继承 多态 而模板元编程和模板编程就是多态对应着的一个重要的部分 "万能”等词也都是为多态打下来坚实的代码基础。
好了 本篇文章就到这里 在这里小编想向大家推荐一个课程
https://xxetb.xetslk.com/s/2PjJ3T
相关文章:
C++ “万能血“ void*指针
本篇文章我们来介绍一下C “万能血” void指针 为什么说他万能呢? 原因:C void* 是一种特殊的指针类型,可用于存放任意对象的地址。在函数传参中也可以作为任何实参的形参 void型详细介绍 void* 是C中的一种特殊的指针类型,被称为"无类…...
微信小程序新手入门教程四:样式设计
WXSS (WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式,决定了 WXML 的组件会怎么显示。 WXSS 具有 CSS 大部分特性,同时为了更适合开发微信小程序,WXSS 对 CSS 进行了扩充以及修改。与 CSS 相比,WXSS …...
类银河恶魔城学习记录1-6 Flip基本设置源代码 P33
Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Player.cs using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; us…...
【Git教程】(一)基本概念 ——工作流、分布式版本控制、版本库 ~
Git教程 基本概念 1️⃣ 为什么要用 Git2️⃣ 为什么要用工作流3️⃣ 分布式版本控制4️⃣ 版本库5️⃣ 简单的分支创建与合并🌾 总结 在本章中,将介绍一个分布式版本控制系统的设计思路,以及它与集中式版本控制系统的不同之处。除此之外&am…...
【QT】VS-code报错:LNK2019: 无法解析的外部符号
目录 0.环境 1.问题简述 2.分析报错原因 3.解决方法 1)set() 相关语句 2)target_link_libraries() 相关语句 4.参考 0.环境 windows11 、 vs-code 、 qt 、 c、编译器为vs2019-x86_amd64 1.问题简述 项目编译release版本时会报错:报错…...
基于 NXP S32K344 的汽车通用评估板方案
S32K3xx 系列是 NXP 基于 ARMCortex-M7 的汽车工业级 MCU,符合 ISO26262 ASIL-D 汽车功能安全等级,支持 ASIL B/D 安全应用,提供了一个可扩展的平台,具有下一代安全性、可扩展性、连接性和低功耗特性。适用于可能会在严酷环境下工…...
WebAssembly002 FFmpegWasmLocalServer项目
项目介绍 https://github.com/incubated-geek-cc/FFmpegWasmLocalServer.git可将音频或视频文件转换为其他可选的多媒体格式,并导出转码的结果 $ bash run.sh FFmpeg App is listening on port 3000!运行效果 相关依赖 Error: Cannot find module ‘express’ …...
瑞_力扣LeetCode_二叉树相关题
文章目录 说明题目 144. 二叉树的前序遍历题解 题目 94. 二叉树的中序遍历题解 题目 145. 二叉树的后序遍历题解 题目 105. 从前序与中序遍历序列构造二叉树题解 题目 106. 从中序与后序遍历序列构造二叉树题解 🙊 前言:本文章为瑞_系列专栏之《刷题》的…...
Axios设置token到请求头的三种方式
1、为什么要携带token? 用户登录时,后端会返回一个token,并且保存到浏览器的localstorage中,可以根据localstorage中的token判断用户是否登录,登录后才有权限访问相关的页面,所以当发送请求时,都要携带to…...
微服务介绍、使用 Nacos 实现远程调用以及 OpenFeign 的使用
1 微服务的概念 区别于单体项目 单体项目拆分成微服务项目的目标:高内聚、低耦合 拆分思路 纵向拆分:根据功能模块 横向拆分:抽取可复用模块 2 微服务拆分——远程调用 背景:微服务单一职责,每个服务只有自己的功能…...
Arthas使用教程—— 阿里开源线上监控诊断产品
文章目录 1 简介2背景3 图形界面工具 arthas 阿里开源3.1 :启动 arthas3.2 help :查看arthas所有命令3.3 查看 dashboard3.4 thread 列出当前进程所有线程占用CPU和内存情况3.5 jvm 查看该进程的各项参数 (类比 jinfo)3.6 通过 jad 来反编译 …...
mac电脑快捷指令实现拼图
mac访达,搜索输入‘快捷指令’,找到‘快捷指令’, 点击快捷指令,进入快捷指令中心,搜索‘拼图’ ,选中‘照片拼图’, 点击‘添加快捷指令’, 在‘所有快捷键指令’中可以看到添加的快…...
R语言入门笔记2.1
分支、循环与函数(1) 1.if语句 在R语言中,if语句用于根据条件执行不同的代码块。其基本语法如下: if (condition) {# 如果条件为真,执行这里的代码块 } else {# 如果条件为假,执行这里的代码块 } 其中&…...
补题:leetcode第382场周赛 3022. 给定操作次数内使剩余元素的或值最小
3022. 给定操作次数内使剩余元素的或值最小 - 力扣(LeetCode) 拆位 n个数进行或运算的结果最小,每次操作可以对相邻的两个数进行与运算,至多进行k次操作 n个数进行或运算,可以对每个数进行拆解,拆解成最小…...
创建型模式-单例模式:定义、实现及应用
目录 一、模式定义二、针对问题1.解决的问题2.解决方案3.举个例子4.设计模式适合场景5.实现方式6.优缺点7.与其他模式的关系 三、代码实现 一、模式定义 单例模式(Singleton Pattern)是一种创建型模式,用于限制某个类只能创建一个对象。它提…...
Prime(VulnHub)
Prime 文章目录 Prime1、nmap2、web渗透随便看看首页隐写查看目录爆破gobusterferoxbusterdirsearchdirb whatwebsearchsploit WordPress 5.2.2/dev/secret.txtFuzz_For_Webwfuzzimage.phpindex.php location.txtsecrettier360文件包含漏洞包含出password.txt尝试ssh登入尝试登…...
爬虫工作量由小到大的思维转变---<第四十二章 Scrapy Redis 重试机制(ip相关)>
前言: 之前讲过一篇关于scrapy的重试机制的文章,那个是针对当时那哥们的代码讲的,但是,发现后面还是有很多问题; 本章节就着scrapy的重试机制来讲一下!!! 正文: 首先,要清楚一个概念,在scrapy的中间件中,默认会有一个scrapy重试中间件;只要你在settings.py设置中写上: RETR…...
python日志管理配置
日志基础配置文件 日志回转查看:参考:https://blog.csdn.net/B11050729/article/details/132353220 项目使用注解实现 """ settings.py logging配置 """ import osroot_dir os.path.normpath(os.path.join(os.path.ab…...
2024.1.28力扣每日一题——水壶问题
2024.1.28 题目来源我的题解方法一 深度搜索(DFS)/广度搜索(BFS)方法二 数学 题目来源 力扣每日一题;题序:365 我的题解 方法一 深度搜索(DFS)/广度搜索(BFSÿ…...
orin nx 安装paddlespeech记录
nx配置: 模块 版本说明 CPU 8核 内存 16G Cuda版本 11.4 Opencv版本 4.5.4 Tensorrt版本 5.1 Cudnn版本 8.6.0.166 Deepstream版本 6.2 Python版本 3.8 算力 100T 安装paddlepaddle: 去飞桨官网下载jetpack版本的:下…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
