获取C++变量类型的简单方法_第1页
获取C++变量类型的简单方法_第2页
获取C++变量类型的简单方法_第3页
获取C++变量类型的简单方法_第4页
获取C++变量类型的简单方法_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第获取C++变量类型的简单方法目录获取C++变量类型与传统方法的对比获取C++数据类型取值范围包含头文件类型变量定义取类型值范围完整代码

获取C++变量类型

直接上代码

#includetype_traits

#includetypeinfo

#includememory

#includestring

#includecstdlib

#includeiostream

#ifndef_MSC_VER

#includecxxabi.h

#endif

usingnamespacestd;

templateclassT

stringtype_name()

typedeftypenameremove_referenceT::typeTR;

unique_ptrchar,void(*)(void*)own(

#ifndef_MSC_VER

abi::__cxa_demangle(typeid(TR).name(),nullptr,nullptr,nullptr),

#else

nullptr,

#endif

free);

stringr=own!=nullptrown.get():typeid(TR).name();

if(is_constTR::value)

r+="const";

if(is_volatileTR::value)

r+="volatile";

if(is_lvalue_referenceT::value)

r+="

elseif(is_rvalue_referenceT::value)

r+="

returnr;

intmain()

inta=1;

constintb=a;

couttype_namedecltype(b)()endl;

}

定义了一个模板函数type_name(),可以对传入的模板类型T进行类型判断,结合指针、左值/右值引用、常类型,准确得出变量的类型。在调用该函数时使用了decltype关键字,传入待确定的变量,然后输出变量类型。

以上运行的结果为

intconst

如果要输出int指针的类型:

intmain()

inta=1;

int*b=

couttype_namedecltype(b)()endl;

}

结果为:

int*

可以看出该函数得出的结果是非常准确而又精简的。

与传统方法的对比

传统输出C++类型的方法是使用typeid(var).name(),其弊端在于输出的结果不完整或者过于冗长。

例如:

1.传统方法打印int类型

#includeiostream

intmain()

inta=10;

std::couttypeid(a).name()std::endl;

}

运行结果为:

i

只得到了int的缩写i。

2.传统方法打印string类型

#includeiostream

#includestring

intmain()

std::stringa="abc";

std::couttypeid(a).name()std::endl;

}

运行结果为:

NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

过于冗长,不便于看出类型名称。

3.传统方法打印引用类型

#includeiostream

intmain()

inta0=23;

inta=a0;

std::couttypeid(a).name()std::endl;

}

运行结果为:

i

并没有准确地输出我们想要的结果。

总结:使用了稍微复杂的模板函数,可以准确输出C++的变量类型,而非大多数人提到的type_id(var).name()打印出来的结果有各种不恰当的地方。

获取C++数据类型取值范围

包含头文件

#includelimits

#includefloat.h

类型变量定义

inta=2;//32位整数4字节4byte32bit

unsignedintb=2u;//无符号32位整数4字节4byte32bit

signedintb1=-2147483648;//有符号32位整数4字节4byte32bit

longc=2l;//32位整数4字节4byte32bit

unsignedlongd=2ul;//无符号32位整数4字节4byte32bit

doublee=2.0;//双精度浮点数

floatf=2.0f;//单精度浮点数

longdoubleg=2.0l;//长双精度浮点数

longlongh=2ll;//超长整数64位整数8字节8byte64bit

shorti=2;//16位整数2字节2byte16bit

unsignedshorti1=2;//无符号16位整数2字节2byte16bit

charj='2';//字符类型1字节1byte8bit

charj1='2';//无符号字符类型1字节1byte8bit

取类型值范围

std::cout"intais:"a"int类型取值范围:"INT_MIN","INT_MAX"\n"

"signedintb1is:"b1"int类型取值范围:"INT_MIN","INT_MAX"\n"

"unsignedintbis:"b"unsignedint类型取值范围:"0","UINT_MAX"\n"

"longcis:"c"long类型取值范围:"LONG_MIN","LONG_MAX"\n"

"unsignedlongdis:"d"unsignedlong类型取值范围:"0","ULONG_MAX"\n"

"doubleeis:"e"double类型取值范围:"DBL_MIN","DBL_MAX"\n"

"floatfis:"f"float类型取值范围:"FLT_MIN","FLT_MAX"\n"

"longdoublegis:"g"longdouble类型取值范围:"LDBL_MIN","LDBL_MAX"\n"

"longlonghis:"h"longlong类型取值范围:"LLONG_MIN","LLONG_MAX"\n"

"shortiis:"i"short类型取值范围:"SHRT_MIN","SHRT_MAX"\n"

"unsignedshortiis:"i1"unsignedshort类型取值范围:"0","USHRT_MAX"\n"

"charjis:"j"char类型取值范围:"CHAR_MIN","CHAR_MAX"\n"

"unsignedcharj1is:"j1"unsignedchar类型取值范围:"0","UCHAR_MAX"\n";

输出效果:

intais:2int类型取值范围:-2147483648,2147483647

signedintb1is:-2147483648int类型取值范围:-2147483648,2147483647

unsignedintbis:2unsignedint类型取值范围:0,4294967295

longcis:2long类型取值范围:-9223372036854775808,9223372036854775807

unsignedlongdis:2unsignedlong类型取值范围:0,18446744073709551615

doubleeis:2double类型取值范围:2.22507e-308,1.79769e+308

floatfis:2float类型取值范围:1.17549e-38,3.40282e+38

longdoublegis:2longdouble类型取值范围:3.3621e-4932,1.18973e+4932

longlonghis:2longlong类型取值范围:-9223372036854775808,9223372036854775807

shortiis:2short类型取值范围:-32768,32767

unsignedshortiis:2unsignedshort类型取值范围:0,65535

charjis:2char类型取值范围:-128,127

unsignedcharj1is:2unsignedchar类型取值范围:0,255

完整代码

#includeiostream

#includechrono

#includethread

#includelimits

#includefloat.h

intmain(){

inta=2;//32位整数4字节4byte32bit

unsignedintb=2u;//无符号32位整数4字节4byte32bit

signedintb1=-2147483648;//有符号32位整数4字节4byte32bit

longc=2l;//32位整数4字节4byte32bit

unsignedlongd=2ul;//无符号32位整数4字节4byte32bit

doublee=2.0;//双精度浮点数

floatf=2.0f;//单精度浮点数

longdoubleg=2.0l;//长双精度浮点数

longlongh=2ll;//超长整数64位整数8字节8byte64bit

shorti=2;//16位整数2字节2byte16bit

unsignedshorti1=2;//无符号16位整数2字节2byte16bit

charj='2';//字符类型1字节1byte8bit

charj1='2';//无符号字符类型1字节1byte8bit

//进度表示写法

intbin2=0b11111111;//二进制0和1前缀:0bstdc++14

intbin8=077;//八进制0~7前缀:0

intbin16=0xff;//十六进制0~F前缀:0x

intaa=INT_MAX*2+1;

unsignedintbb=UINT_MAX;

if(aa==bb)

std::coutUINT_MAXstd::endl;

std::cout"intais:"a"int类型取值范围:"INT_MIN","INT_MAX"\n"

"signedintb1is:"b1"int类型取值范围:"INT_MIN","INT_MAX"\n"

"unsignedintbis:"b"unsignedint类型取值范围:"0","UINT_MAX"\n"

"longcis:"c"long类型取值范围:"LONG_MIN","LONG_MAX"\n"

"unsignedlongdis:"d"unsignedlong类型取值范围:"0","ULONG_MAX"\n"

"doubleeis:"e"double类型取值范围:"DBL_MIN","DBL_MAX"\n"

"floatfis:"f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论