当前位置: 首页 > news >正文

济阳做网站丫个网站建设

济阳做网站,丫个网站建设,百度竞价员,wordpress 文章 属性深入理解 C 中的 std::cref、std::ref 和 std::reference_wrapper 在 C 编程中,有时候我们需要在不进行拷贝的情况下传递引用,或者在需要引用的地方使用常量对象。为了解决这些问题,C 标准库提供了三个有用的工具:std::cref、std:…

深入理解 C++ 中的 std::cref、std::ref 和 std::reference_wrapper

在 C++ 编程中,有时候我们需要在不进行拷贝的情况下传递引用,或者在需要引用的地方使用常量对象。为了解决这些问题,C++ 标准库提供了三个有用的工具:std::crefstd::refstd::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++那些事,更多项目/内容,欢迎加入知识星球。

30cf0f3fe6882f552e1b59db778a301c.jpeg

http://www.yayakq.cn/news/916147/

相关文章:

  • 网站服务器排名前十怎么做网站在谷歌
  • 一起做网站可以一件代发吗医院网站优化
  • 衡阳建设企业网站wordpress注册会员收费下载插件
  • 怎么把自己网站推广出去wppay wordpress
  • 营销网站优化seo濮阳早报
  • 苏州互联网公司多吗seo刷网站
  • 德州网站建设招聘织梦cms小说网站采集
  • 电脑打字赚钱一单一结昆明官网seo厂家
  • 做网站的工资高吗?安装wordpress数据库500
  • 房地产网站开发毕业设计青海省建设工程监理协会网站
  • 企业网站建设实训报告阐述企业搭建网站的重要性
  • 一键免费建站网站域名 过期
  • 网站为什么吸引人图文制作教程
  • 在哪里可以找到网站花桥网站制作
  • 西安知名网站制作公司宁波模板建站代理
  • 网站建设模拟实训题东莞技术好的网站建设
  • 建设银行网站怎么登陆密码忘了怎么办网站建设各部门职责策划
  • 蒙古文政务网站建设工作汇报官网机票特价机票查询
  • 江苏连云港做网站搜索引擎营销的案例
  • 建站平台一键申请三方支付通道太原百度搜索排名优化
  • 申请自助建站网业协同是什么意思
  • 网站没备案怎么做加速哈尔滨网页设计培训
  • 广州网站开发建设用dw做网站怎么添加背景图片
  • 网站备案空间备案p2p网站开发公司
  • 个人婚礼网站模板vs做的网站项目可以改名字吗
  • 公司做网站哪里做微信公众号开通流程
  • 配资网站开发湖北百度推广电话
  • 分析网站常宁网站建设常宁网站建设
  • 网站设计公司请示网站开发模块化开发
  • 网站开发取名企业宣传片影视制作