寿光网站建设公司/数字营销策划

寿光网站建设公司,数字营销策划,装修工人自己接单的app,推进文明网站建设1 std::get() 1.1 用于 std::pair 和 std::tuple ​ 在介绍 std::pair 和 std::tuple 的时候已经介绍过如何用 std::get() 获取对应位置上的值&#xff0c;用法大致如此&#xff1a; std::pair<int, double> p(42, 5.1); assert(std::get<0>(p) p.first); std:…

1 std::get()

1.1 用于 std::pair 和 std::tuple

​ 在介绍 std::pair 和 std::tuple 的时候已经介绍过如何用 std::get() 获取对应位置上的值,用法大致如此:

std::pair<int, double> p(42, 5.1);
assert(std::get<0>(p) == p.first);
std::get<0>(p) = 5;
assert(std::get<0>(p) == 5);std::tuple<int, double, char> t(42, 5.1, 'A');
assert(std::get<0>(t) == 42);
std::get<0>(t) = 5;
assert(std::get<0>(t) == 5);

特别的,在 C++14 之后,还支持通过类型匹配操作 std::pair 和 std::tuple 的元素,比如:

std::tuple<int, double, std::string> t(42, 5.1, "Kitty");
assert(std::get<0>(t) == std::get<int>(t));
std::get<std::string>(t) = "Fin";

1.2 用于 std::array

​ std::get() 也可用于 std::array 容器,用与获取某个位置上的值,

std::array<int, 5> arr {1, 2, 3, 4, 5};
assert(std::get<3>(arr) == 4)
std::get<3>(arr) = 10;
assert(arr[3] == 10);

1.3 用于 std::variant

​ C++17 引入了 std::variant,基本上可以用来取代传统的 union,并且在使用上更方便,类型更安全。 std::get() 也可用于 std::variant,根据类型匹配操作相应的值:

std::variant<int, double, std::string> ifs = 10;
assert(std::get<int>(ifs) == 10);
assert(std::get<0>(ifs) == 10); //等效,因为 int 是第一个位置std::variant<int, std::string> is = "Kitty";
std::cout << std::get<std::string>(is) << std::endl;  // 输出 Kitty

1.4 关于异常

​ std::get() 对于无效的索引参数或类型匹配失败,会抛出一个 std::bad_variant_access 异常,所以使用 std::get(),尤其是对于 std::variant 这种实际类型经常与想象不一致的场合,使用 try 是必须的,否则程序会死的很难看:

std::variant<int, float> v{12};try 
{auto a = std::get<std::string>(v); 
}
catch (std::bad_variant_access&)
{ ... }

1.5 用于自定义类型

​ 标准库提供的 std::get() 函数之所以能用于前面介绍的几种类型,是因为标准库提供了针对这些类型的特化版本,以 std::array 为例,标准库提供了四个特化版本(重载):

template <size_t N, class T, size_t _Size>
constexpr T& get(array<T, _STize>& _Arr) noexcepttemplate <size_t N, class T, size_t _Size>
constexpr const T& get(const array<T, _Size>& _Arr) noexcept;template <size_t N, class T, size_t _Size>
constexpr T&& get(array<T, _Size>&& _Arr) noexcept;template <size_t N, class T, size_t _Size>
constexpr const T&& get(const array<T, _Size>&& _Arr) noexcept;

如果我们希望自定义的类型也能支持 std::get() 函数,只需要给自定义的类型也实现一套对应的特化版本即可。假设有这样一个自定义对象 FooTest,它有三个成员变量:

struct FooTest
{FooTest(const std::string& n, int a, double w){name = n;age = a;weight = w;}std::string name;int age;double weight;
};

我们希望能提供一个功能,允许用户通过这三个成员变量的顺序获取它们,比如用 std::get<0>(ft) 获取 ft.name 的值。具体做起来其实也非常简单,就是针对自定义的类型,比葫芦画瓢,实现这四个全局函数即可:

template <std::size_t N>
auto& get(FooTest& f) noexcept
{static_assert(N < 3);if constexpr (N == 0) return f.name;else if constexpr (N == 1) return f.age;else return f.weight;
}template <std::size_t N>
const auto& get(const FooTest& f) noexcept
{static_assert(N < 3);if constexpr (N == 0) return f.name;else if constexpr (N == 1) return f.age;else return f.weight;
}template <std::size_t N>
auto&& get(FooTest&& f) noexcept
{static_assert(N < 3);if constexpr (N == 0) return std::move(f.name);else if constexpr (N == 1) return std::move(f.age);else return std::move(f.weight);
}template <std::size_t N>
const auto&& get(const FooTest&& f) noexcept
{static_assert(N < 3);if constexpr (N == 0) return std::move(f.name);else if constexpr (N == 1) return std::move(f.age);else return std::move(f.weight);
}

关于 static_assert 和 constexpr 的意义在《C++ 的 if-constexpr》这篇主题中已经介绍过,使用 if-constexpr 需要编译器支持 C++ 17,如果你的编译器不支持 C++ 17,你可以考虑使用特化版本提供它们。以获取 name 属性为例,针对 get<0> 进行特化:

template <>
auto& get<0>(FooTest& f) noexcept
{   return f.name;  }template <>
const auto& get<0>(const FooTest& f) noexcept
{   return f.name;  }template <>
auto&& get<0>(FooTest&& f) noexcept
{   return std::move(f.name);  }template <>
const auto&& get<0>(const FooTest&& f) noexcept
{   return std::move(f.name);  }

其他两个属性分别实现 get<1> 和 get<2> 的特化版本即可。

​ 这样就可以使用自己的 get() 函数 捣鼓出来一些奇奇怪怪的代码了,比如:

FooTest f("Kitty", 3, 2.7);std::string name = std::get<0>(f);
std::get<0>(f) = "Doggy";

如果不怕辣眼睛的话,可以把他们加到 std 空间中,不过,为了避免自定义的类型与标准库中的类型出现名字冲突,最好给自定义类型 FooTest 加上全局域的限定,比如:

namespace std {template <std::size_t N>const auto&& get(const ::FooTest&& f) noexcept;
}

2 std::get_if()

​ std::get() 对于错误的索引或不能找到类型匹配的时候,会抛出异常,那么对于不希望触发异常的场合怎么办呢?C++ 17 很贴心的提供了一个 std::get_if(),用法和 std::get() 类似,但是不会抛出异常。目前 std::get_if() 只能用于 std::variant 类型,其原型如下:

template< std::size_t I, class... Types >
constexpr std::add_pointer_t<std::variant_alternative_t<I, std::variant<Types...>>>get_if( std::variant<Types...>* pv ) noexcept;template< std::size_t I, class... Types >
constexpr std::add_pointer_t<const std::variant_alternative_t<I, variant<Types...>>>get_if( const std::variant<Types...>* pv ) noexcept;

这个函数返回一个指针,指针的类型与返回值的类型一致,可以通过 * 提领该指针指向的内容。当索引非法或指定的类型与 std::variant 实际类型不匹配时,它返回一个空指针。

std::variant<int, float> v{12};if(auto pval = std::get_if<int>(&v))std::cout << "variant value: " << *pval << std::endl; 
else std::cout << "failed to get value!" << std::endl; 

关注作者的算法专栏
https://blog.csdn.net/orbit/category_10400723.html

关注作者的出版物《算法的乐趣(第二版)》
https://www.ituring.com.cn/book/3180

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

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

相关文章

haproxy详解笔记

一、概述 HAProxy&#xff08;High Availability Proxy&#xff09;是一款开源的高性能 TCP/HTTP 负载均衡器和代理服务器&#xff0c;用于将大量并发连接分发到多个服务器上&#xff0c;从而提高系统的可用性和负载能力。它支持多种负载均衡算法&#xff0c;能够根据服务器的…

选购电子实验记录本ELN时,怎么评估?

企业全面数字化的趋势愈发明显&#xff0c;实验室数字化也从“要不要实施”&#xff0c;变为“如何开始实施”、“如何避免实施失败”的紧迫状态。不实施数字化的企业&#xff0c;将迅速落后于同类企业&#xff0c;逐渐被市场淘汰。 其中&#xff0c;电子实验记录本&#xff0…

前端开发工程中如何利用DeepSeek提升工作效率:实战案例与策略解析

目录 引言DeepSeek的核心功能与技术优势实际项目场景与问题分析 3.1 电商网站性能优化3.2 企业级管理系统代码质量提升3.3 跨端应用开发效率优化DeepSeek解决问题的策略与手段 4.1 代码智能分析与重构4.2 性能瓶颈定位与优化建议4.3 团队协作与知识沉淀代码样例与操作流程数据驱…

Linux探秘坊-------7.进程概念

1.进程概念 1.冯诺依曼体系结构 输⼊单元&#xff1a;包括键盘,⿏标&#xff0c;扫描仪,写板等中央处理器(CPU)&#xff1a;含有运算器和控制器等输出单元&#xff1a;显⽰器&#xff0c;打印机等这⾥的存储器指的是内存 ⼀句话&#xff0c;所有设备都 只能直接和内存打交道。…

docker 部署nginx,nginx 504

遇到问题 原因&#xff1a; 因为用的docker 部署nginx, docker 应用与服务之间的端口未开放&#xff0c;导致访问不到服务。

MySQL 联合索引的最左匹配原则

环境&#xff1a;MySQL 版本&#xff1a;8.0.27 执行计划基础知识 possible_keys&#xff1a;可能用到的索引 key&#xff1a;实际用到的索引 type: ref&#xff1a;当通过普通的二级索引列与常量进行等值匹配的方式 询某个表时const&#xff1a;当我们根据主键或者唯一得…

GB300加速推进,RTX 50显卡芯片量产延后,NVIDIA面临新的挑战与机遇

野村分析师Anne Lee在2月12日的报告中表示&#xff0c;2025年全球服务器营收将同比增长46%&#xff0c;2026年增长22%。其中&#xff0c;AI服务器营收预计在2025年和2026年分别增长75%和31%。这些预测与近期美国主要云服务提供商(CSP)上调的资本支出指引基本一致。 GB300加速推…

J6 X8B/X3C切换HDR各帧图像

1、OV手册上的切换命令 寄存器为Ox5074 各帧切换&#xff1a; 2、地平线control tool实现切换命令 默认HDR模式出图&#xff1a; HCG出图&#xff1a; LCG出图 SPD出图 VS出图

游戏引擎学习第101天

回顾当前情况 昨天的进度基本上完成了所有内容&#xff0c;但我们还没有进行调试。虽然我们在运行时做的事情大致上是对的&#xff0c;但还是存在一些可能或者确定的bug。正如昨天最后提到的&#xff0c;既然现在时间晚了&#xff0c;就不太适合开始调试&#xff0c;所以今天我…

【故障处理】- RMAN-06593: platform name ‘Linux x86 64-bitElapsed: 00:00:00.00‘

【故障处理】- RMAN-06593: platform name Linux x86 64-bitElapsed: 00:00:00.00 一、概述二、报错原因三、解决方法 一、概述 使用xtts迁移&#xff0c;在目标端进行恢复时&#xff0c;遇到RMAN-06593: platform name Linux x86 64-bitElapsed: 00:00:00.00’报错。 二、报错…

多模态本地部署和ollama部署Llama-Vision实现视觉问答

文章目录 一、模型介绍二、预期用途1. 视觉问答(VQA)与视觉推理2. 文档视觉问答(DocVQA)3. 图像字幕4. 图像-文本检索5. 视觉接地 三、本地部署1. 下载模型2. 模型大小3. 运行代码 四、ollama部署1. 安装ollama2. 安装 Llama 3.2 Vision 模型3. 运行 Llama 3.2-Vision 五、效果…

哪吒闹海!SCI算法+分解组合+四模型原创对比首发!SGMD-FATA-Transformer-LSTM多变量时序预测

哪吒闹海&#xff01;SCI算法分解组合四模型原创对比首发&#xff01;SGMD-FATA-Transformer-LSTM多变量时序预测 目录 哪吒闹海&#xff01;SCI算法分解组合四模型原创对比首发&#xff01;SGMD-FATA-Transformer-LSTM多变量时序预测效果一览基本介绍程序设计参考资料 效果一览…

MySQL调用存储过程和存储函数

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

网络防御高级-第8章及之前综合作业

标准版 接口ip配置 r2 [r2]interface GigabitEthernet 0/0/0 [r2-GigabitEthernet0/0/0]ip address 13.0.0.3 24 [r2-GigabitEthernet0/0/0]interface GigabitEthernet 0/0/1 [r2-GigabitEthernet0/0/1]ip address 100.1.1.254 24 [r2-GigabitEthernet0/0/1]interface Gigab…

常见的排序算法:插入排序、选择排序、冒泡排序、快速排序

1、插入排序 步骤&#xff1a; 1.从第一个元素开始&#xff0c;该元素可以认为已经被排序 2.取下一个元素tem&#xff0c;从已排序的元素序列从后往前扫描 3.如果该元素大于tem&#xff0c;则将该元素移到下一位 4.重复步骤3&#xff0c;直到找到已排序元素中小于等于tem的元素…

【数据结构】寻找规律:算对角线长度||杨辉三角||魔方问题(C语言实现)

目录标题 三个算法1. 求矩阵对角线元素之和&#xff08;C语言&#xff09;2. 杨辉三角3. 幻方问题 总结&#xff1a;都是通过寻找规律来找出构造逻辑然后用循环来实现 三个算法 1. 求矩阵对角线元素之和&#xff08;C语言&#xff09; 1.初始化行循环变量i和列循环遍历j&…

Vue的学习(5)

1.路由进阶 1.路由模块封装 路由的封装抽离 问题&#xff1a;所有的路由配置都堆在main.js中合适么&#xff1f; 目标&#xff1a;将路由模块抽离出来。 好处&#xff1a;拆分模块&#xff0c;利于维护 小结&#xff1a; 路由模块的封装抽离的好处是什么&#xff1f; 拆分模…

设备智能化无线通信,ESP32-C2物联网方案,小尺寸芯片实现大功能

在科技飞速发展的当下&#xff0c;我们的生活正被各类智能设备悄然改变&#xff0c;它们如同一位位无声的助手&#xff0c;渗透到我们生活的每一个角落&#xff0c;让生活变得更加便捷和丰富多彩。 智能插座、智能照明和简单家电设备在家居领域的应用&#xff0c;为我们的生活…

Excel大数据量导入导出

github源码 地址&#xff08;更详细&#xff09; : https://github.com/alibaba/easyexcel 文档&#xff1a;读Excel&#xff08;文档已经迁移&#xff09; B 站视频 : https://www.bilibili.com/video/BV1Ff4y1U7Qc 一、JAVA解析EXCEL工具EasyExcel Java解析、生成Excel比较…

Java基础知识总结(四十八)--TCP传输、TCP客户端、TCP服务端

**TCP传输&#xff1a;**两个端点的建立连接后会有一个传输数据的通道&#xff0c;这通道称为流&#xff0c;而且是建立在网络基础上的流&#xff0c;称之为socket流。该流中既有读取&#xff0c;也有写入。 **tcp的两个端点&#xff1a;**一个是客户端&#xff0c;一个是服务…