【C++】 C++11 新特性探索:decltype 和 auto

news2024/11/24 4:00:40

▒ 目录 ▒

    • 🛫 问题
      • 描述
      • 环境
    • 1️⃣ decltype
      • 推导变量类型
      • 推导函数返回类型
    • 2️⃣ auto
      • 自动推导变量类型
      • 迭代器和范围循环
    • 3️⃣ decltype 和 auto 同时使用
    • 🛬 结论
    • 📖 参考资料

🛫 问题

描述

C++11 引入了一些强大的新特性,其中包括 decltype 和 auto。本文将深入探索这两个关键字的作用和用法,并展示它们在现代 C++ 开发中的实际用例。

环境

版本号描述
文章日期2023-12-16

1️⃣ decltype

decltype 关键字用于推导表达式的类型,它可以根据表达式的结果推断出返回类型。它的语法如下所示:
decltype(expression)

推导变量类型

使用 decltype 可以方便地推导变量的类型,尤其是在复杂的模板编程场景下。例如,我们可以通过以下方式声明一个与已有变量类型相同的新变量:

int x = 42;
decltype(x) y; // 声明一个与 x 类型相同的变量 y

推导函数返回类型

decltype 还可以用于推导函数的返回类型。在某些情况下,函数的返回类型可能会非常复杂,使用 decltype 可以避免手动编写冗长的类型说明。例如:

int foo();
float bar();

decltype(foo()) result1; // 推导出 foo() 的返回类型
decltype(bar()) result2; // 推导出 bar() 的返回类型

2️⃣ auto

auto 关键字用于自动推导变量的类型,它可以根据变量的初始值推断出最合适的类型。它的语法如下所示:auto variable = expression;

自动推导变量类型

使用 auto 关键字可以更加简洁地声明变量,并且不需要显式指定变量的类型。编译器会根据变量的初始值自动推断出最合适的类型。例如:

auto x = 42; // x 的类型被推断为 int
auto y = 3.14; // y 的类型被推断为 double
auto z = "Hello"; // z 的类型被推断为 const char*

迭代器和范围循环

auto 关键字在处理容器迭代器和范围循环时非常有用。通过使用 auto,我们可以简化代码并避免繁琐的类型声明。例如:

std::vector<int> numbers = {1, 2, 3, 4, 5};

// 使用 auto 迭代容器元素
for (auto it = numbers.begin(); it != numbers.end(); ++it) {
    std::cout << *it << " ";
}

// 使用范围循环
for (auto number : numbers) {
    std::cout << number << " ";
}

3️⃣ decltype 和 auto 同时使用

经常写函数指针的情况,以前往往需要写大量定义。C11后(C17更强大)可以如下两种方式编写,代码更少更方便了。

  • decltype(auto) func = &MessageBoxA;
  • auto func2 = decltype(&MessageBoxA)MyMessageBoxA;
    在这里插入图片描述

🛬 结论

decltype 和 auto 是 C++11 引入的两个重要关键字,它们为我们提供了更强大、更灵活的类型推导和变量声明方式。通过使用 decltype,我们可以方便地推导表达式和函数的返回类型;而使用 auto,则可以自动推导变量的类型,使代码更加简洁
这两个关键字在现代 C++ 开发中广泛应用于模板编程、容器操作和范围循环等场景。
然而,需要注意的是过度使用 decltype 和 auto 可能会导致代码可读性下降。在某些情况下,明确指定变量类型和函数返回类型可能更加明确和易于理解。因此,在使用这两个关键字时,我们应该权衡代码的简洁性和可读性,并根据实际情况做出合适的选择。

📖 参考资料

  • decltype (C++) https://learn.microsoft.com/zh-cn/cpp/cpp/decltype-cpp?view=msvc-170

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

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

相关文章

探索 HBase GUI 工具,助您轻松驾驭大数据世界!

你是否曾为 HBase 数据管理而苦恼&#xff1f;别担心&#xff0c;这一款超级好用的 HBase GUI &#xff08;HBase Assistant&#xff09;工具&#xff0c;让您在大数据世界中游刃有余。不再需要繁琐的命令行操作&#xff0c;也不再为复杂的配置感到头疼。 主要功能 直观和设计…

AttributeError: module ‘edge_tts‘ has no attribute ‘Communicate‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

插入排序:直接插入排序 希尔排序

插入排序&#xff1a; 假设红竖线前的元素全部排好序&#xff0c;红线后面的数即为要插入的数据&#xff0c;红线依次往后移&#xff0c;假设end为排好序的最后一个数字&#xff0c;end1即为要插入的数字&#xff0c;一次插入时&#xff0c;end与要插入的数字依次比较&#xf…

自定义时间选择器

自定义时间选择器 文章目录 自定义时间选择器第一章 效果演示第01节 效果图第02节 主要文件 第二章 案例代码第01节 核心文件 WheelPicker第02节 实体类 WheelBean第03节 接口类 IWheelPicker第04节 原子时间类 DateTimePickerView第05节 原子时间类 PickerYear第06节 原子时间…

比特币价格创新高:加密货币的崛起与未来

一、引言 近年来&#xff0c;比特币的价格一路上涨&#xff0c;引起了全球投资者和市场的广泛关注。作为最早一批区块链技术应用案例之一&#xff0c;比特币的成功带动了整个加密货币市场的兴起。本文将探讨比特币价格创新高的原因、加密货币的崛起以及未来发展趋势。 二、比特…

CV炼丹心得总结

1&#xff0c;ResNet的思想 yF(x)x 这个经验可帮助模型更快的收敛 class Block(nn.Module): # Encoder Blockdef __init__(self,dim, # 每个token的维度drop_rate0.1,switch_flagFalse,num_heads8):super(Block, self).__init__()self.switch_flag switch_flagself.…

驾龄不足三年如何注册网约车?刘师傅的反击之途!

刘师傅是个勤奋的司机。他想注册成为一名网约车司机&#xff0c;但由于驾龄不够三年&#xff0c;他一直被平台回绝。在多次尝试注册失败后&#xff0c;刘师傅慢慢四处求助。他咨询了多个渠道&#xff0c;但都没有得到有效的解决方案。当他在准备放弃的时候&#xff0c;他得知了…

从0创建并部署一个网页到服务器

创建一个页面 1 下载node.js 下载VScode 2 在Windows下找一个路径新建一个文件夹 例如&#xff1a;D:\study_project\PersonalWeb 3 VSCodee中打开文件夹 4 Windows下 管理员身份打开命令提示符&#xff0c;执行npm install -g vue/cli 5 VSCode下打开终端&#xff0c;执…

使用Audition录制电脑内部声音

在电脑上播放的媒体文件&#xff0c;包括视频和声音&#xff0c;很多是可以播放却无法保存的。例如一些网页播放的视频&#xff0c;或者在线播放的音乐。 视频的话&#xff0c;可以使用工具来截图&#xff0c;抓取GIF或录屏。 声音的话&#xff0c;也可以使用工具进行录制。这里…

【️Java是值传递还是引用传递?】

✅Java是值传递还是引用传递&#xff1f; ✅Java是值传递还是引用传递&#xff1f;✅典型理解 ✅增加知识仓✅Java的求值策略✅Java中的对象传递✅值传递和共享对象传递的现象冲突吗? ✅总结 ✅Java是值传递还是引用传递&#xff1f; ✅典型理解 编程语言中需要进行方法间的…

实战演示 H5 性能分析

W3C标准是浏览器标准&#xff0c;一般浏览器都支持W3C标准&#xff0c;它规定使用者可以通过api查询性能信息&#xff0c;可借用W3C协议完成自动化H5性能测试。 W3C官网&#xff1a;www.w3.org/TR/navigati… 使用chrome浏览器对webview进行手工查看&#xff0c;伴随着业务增多…

ChatGPT4 Excel 高级组合函数用法index+match完成实际需求

在Excel 函数用法中有一对组合函数使用是非常多的,那就是Index+match组合函数。 接下来我们用一个实际的需求让ChatGPT来帮我们实现一下。 我们给ChatGPT4发送一个prompt:有一个表格A2至A14为业务员B列至H列为1月至7月的销售额,请根据J2单元格的业务员与K2单元格的月份查找出…

【python】Debian安装miniconda、spyder、tushare

1. miniconda 安装 — 动手学深度学习 2.0.0 documentation中有安装Miniconda的一些说明。 Miniconda — miniconda documentation是Miniconda网站&#xff0c;里面也有安装说明。 Debian安装按照linux安装即可&#xff1a; mkdir -p ~/miniconda3 wget https://repo.anaco…

NoSQL 数据库有哪些典型应用?

前面的内容介绍了数据库读写分离和分库分表相关知识&#xff0c;都是针对关系型数据库的&#xff0c;即通常说的 RDBMS。除了关系型数据库&#xff0c;NoSQL 在项目开发中也有着越来越重要的作用&#xff0c;与此同时&#xff0c;NoSQL 相关的内容也是面试的常客。今天我们一起…

OSG中几何体的绘制(二)

5. 几何体操作 在本章的前言中就讲到&#xff0c;场景都是由基本的绘图基元构成的&#xff0c;基本的绘图基元构成简单的几何体,简单的几何体构成复杂的几何体&#xff0c;复杂的几何体最终构造成复杂的场景。当多个几何体组合时&#xff0c;可能存在多种降低场景渲染效率的原因…

基于linux系统的Tomcat+Mysql+Jdk环境搭建(二)jdk1.8 linux 上传到MobaXterm 工具的已有session里

【JDK安装】 1.首先下载一个JDK版本 官网地址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 下载1.8版本&#xff0c;用红框标注出来了&#xff1a; 也许有的同学看到没有1.8版本&#xff0c;你可以随便下载一个linux的…

最强Pose模型RTMO开源 | 基于YOLO架构再设计,9MB+9ms性能完爆YOLO-Pose

实时多人在图像中的姿态估计面临着在速度和精度之间实现平衡的重大挑战。尽管两阶段的上下文方法在图像中人数增加时会减慢速度&#xff0c;但现有的单阶段方法往往无法同时实现高精度和实时性能。 本文介绍了RTMO&#xff0c;这是一个单阶段姿态估计框架&#xff0c;通过在YOL…

【十】我们都是面向spring注解开发的

spring 注解驱动开发 简介&#xff1a; 前面有写过spring框架的演进历程&#xff0c;得出一个结论就是我们都是面向spring编程的&#xff0c;这里讲另一个结论&#xff1a;我们都是面向spring注解开发的。spring框架的核心设计理念是简化java开发&#xff0c;而这一路的发展越…

超分辨率重建——SAN训练自己数据集及推理测试(详细图文教程)

目录 一、源码包下载二、数据集准备三、预训练权重文件四、训练环境五、训练5.1 超参数修改5.2 训练模型5.2.1 命令方式训练5.2.2 Configuration配置参数方式训练 5.3 模型保存 六、推理测试6.1 超参数修改6.2 测试6.2.1 命令方式测试6.2.2 Configuration配置参数方式测试 6.3 …

TCP报文头(首部)详解

本篇文章基于 RFC 9293: Transmission Control Protocol (TCP) 对TCP报头进行讲解&#xff0c;部分内容会与旧版本有些许区别。 TCP协议传输的数据单元是报文段&#xff0c;一个报文段由TCP首部&#xff08;报文头&#xff09;和TCP数据两部分组成&#xff0c;其中TCP首部尤其重…