深入理解 C++ 中的 std::cref、std::ref 和 std::reference_wrapper
深入理解 C++ 中的 std::cref、std::ref 和 std::reference_wrapper
在 C++ 编程中,有时候我们需要在不进行拷贝的情况下传递引用,或者在需要引用的地方使用常量对象。为了解决这些问题,C++ 标准库提供了三个有用的工具:std::cref、std::ref 和 std::reference_wrapper。这篇文章将深入探讨这些工具的用途、区别以及实际应用。
此外,我们知道Rust语言中,经常实现了Unwrap方法,在C++中如何实现?
这就参考Apache arrow的代码了,有这么一段:
std::optional<std::reference_wrapper<const TransportStatusDetail>>
TransportStatusDetail::Unwrap(const Status& status) {std::shared_ptr<StatusDetail> detail = status.detail();if (!detail) return std::nullopt;if (detail->type_id() != kTypeId) return std::nullopt;return std::cref(arrow::internal::checked_cast<const TransportStatusDetail&>(*detail));
} 随后我们便可以通过这样调用,提取出Status中实际的TransportStatusDetail。
Status status(transportDetail);
auto result = Unwrap(status); 下面来从几个方面看看,最后给出整个Demo代码。
1. std::cref:创建常量引用
std::cref 是一个模板函数,用于创建对常量对象的引用。它返回一个 std::reference_wrapper 对象,可以在需要引用的地方使用。这在函数参数传递中特别有用,因为它允许我们在不进行拷贝的情况下传递常量对象,同时保持引用的语义。
示例:
#include <iostream>
#include <functional>void printValue(const int& value) {std::cout << "Value: " << value << std::endl;
}int main() {int number = 42;auto crefNumber = std::cref(number);printValue(crefNumber); // 使用常量引用传递参数return 0;
} 2. std::ref:创建可修改的引用
与 std::cref 不同,std::ref 是一个模板函数,用于创建对可修改对象的引用。它返回一个 std::reference_wrapper 对象,允许我们在需要引用的地方使用,同时允许修改被引用的对象。
示例:
#include <iostream>
#include <functional>void modifyValue(int& value) {value *= 2;
}int main() {int number = 42;auto refNumber = std::ref(number);modifyValue(refNumber); // 使用可修改的引用作为参数std::cout << "Modified Value: " << number << std::endl;return 0;
} 3. std::reference_wrapper:引用的包装器
std::reference_wrapper 是一个模板类,用于包装引用,使其能够在容器中存储或以引用的形式传递。它提供类似引用的语法,并且可以与标准容器一起使用,因为容器无法直接存储引用。
示例:
#include <iostream>
#include <vector>
#include <functional>int main() {int number1 = 42;int number2 = 73;std::vector<std::reference_wrapper<int>> numbers = {std::ref(number1), std::ref(number2)};for (auto& num : numbers) {num.get() += 10; // 修改原始对象的值}std::cout << "Number 1: " << number1 << std::endl;std::cout << "Number 2: " << number2 << std::endl;return 0;
} 在这个示例中,std::reference_wrapper 允许我们将引用包装在容器中,然后通过 get() 方法来访问和修改原始对象的值。
4.Unwrap Demo
这里给出具体的代码段,其完整代码参见知识星球内容。
std::optional<std::reference_wrapper<const TransportStatusDetail>> Unwrap(const Status& status) {std::shared_ptr<StatusDetail> detail = status.detail();if (!detail) return std::nullopt;if (detail->type_id() != kTypeId) return std::nullopt;return std::cref(static_cast<const TransportStatusDetail&>(*detail));
}int main() {// 创建 TransportStatusDetail 对象std::shared_ptr<StatusDetail> transportDetail = std::make_shared<TransportStatusDetail>();// 创建 Status 对象并传入 TransportStatusDetail 对象Status status(transportDetail);auto result = Unwrap(status);if (result) {const TransportStatusDetail& detail = result.value().get();// 使用 detail 进行操作std::cout << "TransportStatusDetail found." << std::endl;} else {std::cout << "No valid TransportStatusDetail found." << std::endl;}return 0;
} 欢迎一起探讨C++那些事,更多项目/内容,欢迎加入知识星球。

相关文章:
深入理解 C++ 中的 std::cref、std::ref 和 std::reference_wrapper
深入理解 C 中的 std::cref、std::ref 和 std::reference_wrapper 在 C 编程中,有时候我们需要在不进行拷贝的情况下传递引用,或者在需要引用的地方使用常量对象。为了解决这些问题,C 标准库提供了三个有用的工具:std::cref、std:…...
在其他python环境中使用jupyter notebook
1、切换到目标python环境 activate 目标python环境 2、安装notebook内核包 pip install ipykernel 3、加环境加入到notebook中 python -m ipykernel install 目标python环境 4、切换到base环境 activate base 5、打开目标项目的对应盘 如果,项目在c盘&…...
计算机网络-笔记-第二章-计算机网络概述
目录 二、第二章——物理层 1、物理层的基本概念 2、物理层下面的传输媒体 (1)光纤、同轴电缆、双绞线、电力线【导引型】 (2)无线电波、微波、红外线、可见光【非导引型】 (3)无线电【频谱的使用】 …...
Hive字符串数组json类型取某字段再列转行
一、原始数据 acctcontent1232313[{"name":"张三","code":"上海浦东新区89492jfkdaj\r\n福建的卡"...},{"name":"狂徒","code":"select * from table where aa1\r\n and a12"...},{...}]...…...
ElementUI Table 翻页缓存数据
Element UI Table 翻页保存之前的数据,网上找了一些,大部分都是用**:row-key** 和 reserve-selection,但是我觉得有bug,我明明翻页了…但是全选的的个框还是勾着的(可能是使用方法不对,要是有好使的…请cute我一下…感谢) 所以自己写了一个… 思路: 手动勾选的时候,将数据保存…...
使用 AutoGPTQ 和 transformers 让大语言模型更轻量化
大语言模型在理解和生成人类水平的文字方面所展现出的非凡能力,正在许多领域带来应用上的革新。然而,在消费级硬件上训练和部署大语言模型的需求也变得越来越难以满足。 🤗 Hugging Face 的核心使命是 让优秀的机器学习普惠化 ,而…...
AUTOSAR规范与ECU软件开发(实践篇)6.5 BswM模块概念与配置方法介绍
目录 1、BswM模块概念与配置方法介绍 (1) BswMModeRequestPort配置 (2) ModeCondition与LogicalExpression配置...
1.1 VMware Workstation与Kali的安装和配置1
资源见专栏第一篇文章https://blog.csdn.net/algorithmyyds/article/details/132457258 安装VMware 不多加赘述,直接按顺序安装即可。 有以下需注意的地方: 1.建议选择增强型服务; 2.不要加入体验改进计划。是否开启提示更新看你的想法&…...
DDR与PCIe:高性能SoC的双引擎
SoC芯片无处不在,小到家电控制的MCU,大到手机芯片,我们都会接触到。如今大部分芯片设计公司都在开发SoC芯片,一颗SoC芯片可以集成越来越多的功能,俨然它已成为IC设计业界的焦点。 高性能、高速、高带宽的互联和存储的…...
C#_特性反射详解
特性是什么? 为程序元素额外添加声明信息的一种方式。 字面理解:相当于把额外信息写在干胶标签上,然后将其贴在程序集上。 反射是什么? 反射是一种能力,运行时获取程序集中的元数据。 字面理解:程序运行…...
【跟小嘉学 Rust 编程】十三、函数式语言特性:迭代器和闭包
系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...
时间复杂度和空间复杂度
全文目录 算法的复杂度时间复杂度大O渐进表示法空间复杂度常见算法复杂度对比 算法的复杂度 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度…...
mac docker 卡住解决
文章目录 1、问题简述2、重新安装docker3、docker守护进程4、问题解决方案 1、问题简述 在docker desktop上更改了daemon.json的文件内容,应该是参数写的有问题,修改完配置再启动docker desktop就失败了,然后想着卸载docker desktop…...
linux/centos zookeeper 使用记录
配置cfg 下载zookeeper-3.4.14.tar.gz负责到centos服务器解压 /xxx/zookeeper-3.4.14/conf/下创建zoo.cfg文件并配置以下属性,/bsoft/zookeeperdata/目录先预先创建 tickTime2000 initLimit10 syncLimit5 dataDir/bsoft/zookeeperdata/ clientPort2181zk启动/重启/关…...
用wireshark流量分析的四个案例
目录 第一题 1 2 3 4 第二题 1 2 3. 第三题 1 2 第四题 1 2 3 第一题 题目: 1.黑客攻击的第一个受害主机的网卡IP地址 2.黑客对URL的哪一个参数实施了SQL注入 3.第一个受害主机网站数据库的表前缀(加上下划线例如abc) 4.…...
Oracle 时区详解
1 简介 由于地球经纬度及地球自转引起的经度方向,不同的经度的地方,所感受到的昼夜是不同 的。有关国际会议决定将地球表面按经线从东到西,每隔经度15度划分一个时区,并且规定 相邻区域的时间相差1小时。 这就是时区的由来。 而实际使用中,…...
仿mudou高性能高并发服务器
"这个结局是我的期待,我会一直为你祝福。" 项目实现目标: 仿muduo库One Thread One Loop式主从Reacto模型实现高并发服务器。通过实现高并发服务器组件,简洁快速完成搭建一个高性能服务器。并且,通过组件内提供的不同应⽤层协议⽀…...
vue权限管理——菜单权限设置
1.前提:后端提供菜单对应数据 此处用mockjs模拟 const menuList [{id: 1, path:/uploadSpec,authName: "上传spec", icon: User, children:[], rights:[view,add,edit,delete]},{id: 2, path:/showSpec, authName: "Spec预览", icon: DataAn…...
【LeetCode】228.汇总区间
题目 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b]…...
Qt快速学习(二)--QMainWindow,对话框,布局管理器,常用控件
目录 1 QMainWindow 1.1 菜单栏 1.2 工具栏 1.3 状态栏 1.4 铆接部件 1.5 核心部件(中心部件) 1.6 资源文件 2 对话框QDialog 2.1 基本概念 2.2 标准对话框 2.3 自定义消息框 2.4 消息对话框 2.5 标准文件对话框 3 布局管理器 3.1 系统…...
黑丝空姐-造相Z-Turbo应用场景:快速生成创意配图,提升内容创作效率
黑丝空姐-造相Z-Turbo应用场景:快速生成创意配图,提升内容创作效率 1. 镜像概述与核心价值 黑丝空姐-造相Z-Turbo是一款基于Xinference部署的文生图模型服务,专门针对特定风格图片生成进行了优化。该镜像通过gradio提供了直观的Web界面&…...
高效处理海量数据——pandas分块读取与内存管理实战
1. 为什么需要分块读取千万级数据? 第一次处理千万级CSV文件时,我盯着16GB的硬盘文件发愁——128GB内存的服务器居然加载到一半就崩溃了。这种场景在金融交易记录、物联网传感器数据、用户行为日志分析中太常见了。pandas默认的read_csv()会一次性把数据…...
Qwen3-Reranker-0.6B快速体验:搭建个人语义排序服务的简单方法
Qwen3-Reranker-0.6B快速体验:搭建个人语义排序服务的简单方法 1. 为什么你需要一个轻量级语义排序服务 在信息检索和问答系统中,语义排序(Reranking)是一个关键环节。想象一下,当用户输入一个问题后,系统…...
Qwen3-ASR-1.7B效果实测:识别普通话、英语、方言,准确率惊人
Qwen3-ASR-1.7B效果实测:识别普通话、英语、方言,准确率惊人 1. 多语言语音识别新标杆 当我第一次听到Qwen3-ASR-1.7B能够识别30种语言和22种中文方言时,说实话我是持怀疑态度的。毕竟在语音识别领域,支持的语言越多,…...
Qwen3智能字幕系统效果展示:法庭庭审录音→高司法术语准确率字幕
Qwen3智能字幕系统效果展示:法庭庭审录音→高司法术语准确率字幕 1. 引言:当AI成为“数字书记员” 想象一下这样的场景:一场长达数小时的法庭庭审正在进行,书记员的手指在键盘上飞速敲击,试图跟上律师与证人间密集、…...
DLSS Swapper终极指南:如何快速管理游戏DLSS版本提升性能?
DLSS Swapper终极指南:如何快速管理游戏DLSS版本提升性能? 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专为NVIDIA显卡用户设计的智能管理工具,能够无缝管理游…...
如何通过Mem Reduct实现系统内存智能优化?专业用户的实战指南
如何通过Mem Reduct实现系统内存智能优化?专业用户的实战指南 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct …...
插件管理终极指南:从入门到精通的全方位策略
插件管理终极指南:从入门到精通的全方位策略 【免费下载链接】Magpie An all-purpose window upscaler for Windows 10/11. 项目地址: https://gitcode.com/gh_mirrors/mag/Magpie 为什么80%的用户都没用对插件功能?在开源工具Magpie的使用过程中…...
OpenClaw浏览器控制:GLM-4.7-Flash实现自动化数据采集
OpenClaw浏览器控制:GLM-4.7-Flash实现自动化数据采集 1. 为什么选择OpenClaw进行网页数据采集 去年我在做一个市场分析项目时,遇到了一个棘手的问题——需要从十几个行业网站定期采集数据,但每个网站的页面结构都不一样。手动复制粘贴效率…...
UE5 Python远程执行:利用UDP组播实现高效命令分发
1. 为什么需要UE5 Python远程执行? 想象一下这个场景:你正在开发一个大型UE5项目,团队里有10个设计师需要同时修改场景参数。传统做法是每个人手动操作编辑器,或者通过RPC一个个连接。这种方式的效率有多低,相信每个开…...
