




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第获取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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美团外卖商家订单分成合同
- 直播活动内容补充与品牌合作协议
- 软性材料研发与市场推广合伙协议
- 网络文学有声书制作与环保公益活动合作协议
- 影视作品版权购买与版权收益分成合同
- 顶级域名所有权及商业价值转让服务合同
- 影视特效动作捕捉系统全面解决方案租赁协议
- 生物样本冷链物流与生命科学研究支持合同
- 小产权房配套设施共享及社区公共设施保养维护合同
- 电商侵权案件管辖权争议补充协议
- 网络与信息安全管理员考试题+参考答案解析
- 《故宫公开课》课件
- 《智能家居系统介绍》课件
- 2025-2030年中国证券融资融券市场需求态势及投资风险预测研究报告
- 淘宝运营考试试题及答案
- 急性脑梗塞患者护理查房
- 2025年河南郑州航空港科创投资集团有限公司招聘笔试参考题库含答案解析
- 腾讯学院培训课件
- 认知增强技术在法律领域的应用-全面剖析
- 化学自制米酒 领略我国传统酿造工艺的魅力课件 2024-2025学年高一下鲁科版(2019)必修第二册
- 贵州省往年气象局笔试公共基础题库
评论
0/150
提交评论