C++入门教程(21):类型推导和类型提取

逻辑琉璃探
• 阅读 3074

类型推导

写C++代码时,经常遇到特别长的数据类型,由于这个原因,C++新增类型推导功能auto

用法:

auto a = 0;

类型推导,就是由编译器在编译期推导出=右边的数据类型,为=左边的变量决定数据类型。例如上面例子,0默认是int类型,那么变量a的数据类型就是int

类型提取

有时候,不能使用类型推导但还是要用某个变量的类型作为新变量的类型,这个时候就可以用关键字deltype

类型提取经常与模板配合使用,模板是C++的利器,将在后续讲解。

用法:

auto a = 0;
decltype(a) b = 10;

从变量a中提取出数据类型,即int,然后作为变量b的数据类型,所以变量b的数据类型也是int

提示:

当使用VS和VS Code的时候,用鼠标指着变量,将可以看到变量的数据类型。

基础示例

举个完整的代码例子:

#include <iostream> // std::cout std::endl std::boolalpha
#include <type_traits> // std::is_same

int main(void)
{
    const auto value = 0ul; // 在类型中提取出类型作为变量的类型, const unsigned long
    std::cout << std::boolalpha << "value的类型是不是const unsigned long?";
    std::cout << std::is_same<decltype(value), const unsigned long>::value << std::endl;
    return 0;
}

输出结果:

value的类型是不是const unsigned long?true

基础讲解

由于0ulunsigned long的类型,然后再配一个const关键字,所以变量value的类型就是const unsigned long

const auto value = 0ul;

std::is_same可以用来判断两个数据类型是不是一样,用法如下:

std::is_same<数据类型1, 数据类型2>::value

当两个数据类型相同时,上面的值就是true;当两个数据类型不相同时,上面的值就是false

使用decltype提取出变量value的数据类型:decltype(value),然后和const unsigned long进行比较,最后输出结果是true,证明变量value的数据类型就是const unsigned long

另外,std::is_same使用前需要引入type_traits标准库。

补充知识(了解即可)

  1. 关键字auto很久以前,只要声明变量都要在数据类型前面添加auto。事实上,很久以前就可以不加,auto相当一个没用的关键字。所以从C++11起,废弃了这个没用的功能。
  2. 从C++11起,关键字auto被赋予类型推导的功能。
  3. 关键字decltype从C++11开始加入。
点赞
收藏
评论区
推荐文章
小万哥 小万哥
1年前
提升面试成功率:深入理解 C++ 11 新特性
背景C11是C语言的一个重大更新,引入了许多新特性,包括自动类型推导、lambda表达式、右值引用、智能指针等等。这些新特性使得C更加现代化、高效、易用。也是面试容很容易被问到一个问题,下面我将简要介绍一些C11的新特性:自动类型推导C
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
3年前
typeScript数据类型
//布尔类型letisDone:booleanfalse;//数字类型所有数字都是浮点数numberletdecLiteral:number6;lethexLiteral:number0xf00d;letbinaryLiteral:number0b101
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
逻辑琉璃探
逻辑琉璃探
Lv1
雨后的彩虹,苏醒的野花显得格外清新。
文章
4
粉丝
0
获赞
0