網站首頁 編程語言 正文
獲取C++變量類型
直接上代碼
#include <type_traits>
#include <typeinfo>
#include <memory>
#include <string>
#include <cstdlib>
#include <iostream>
#ifndef _MSC_VER
#include <cxxabi.h>
#endif
using namespace std;
template <class T>
string type_name()
{
? ? typedef typename remove_reference<T>::type TR;
? ? unique_ptr<char, void (*)(void *)> own(
#ifndef _MSC_VER
? ? ? ? abi::__cxa_demangle(typeid(TR).name(), nullptr, nullptr, nullptr),
#else
? ? ? ? nullptr,
#endif
? ? ? ? free);
? ? string r = own != nullptr ? own.get() : typeid(TR).name();
? ? if (is_const<TR>::value)
? ? ? ? r += " const";
? ? if (is_volatile<TR>::value)
? ? ? ? r += " volatile";
? ? if (is_lvalue_reference<T>::value)
? ? ? ? r += "&";
? ? else if (is_rvalue_reference<T>::value)
? ? ? ? r += "&&";
? ? return r;
}
int main()
{
? ? int a = 1;
? ? const int &b = a;
? ? cout << type_name<decltype(b)>() << endl;
}
定義了一個模板函數type_name(),可以對傳入的模板類型T進行類型判斷,結合指針、左值/右值引用、常類型,準確得出變量的類型。在調用該函數時使用了decltype關鍵字,傳入待確定的變量,然后輸出變量類型。
以上運行的結果為
int const&
如果要輸出int指針的類型:
int main()
{
? ? int a = 1;
? ? int* b = &a;
? ? cout << type_name<decltype(b)>() << endl;
}
結果為:
int*
可以看出該函數得出的結果是非常準確而又精簡的。
與傳統方法的對比
傳統輸出C++類型的方法是使用typeid(var).name(),其弊端在于輸出的結果不完整或者過于冗長。
例如:
1. 傳統方法打印int類型
#include <iostream>
int main()
{
? int a = 10;
? std::cout << typeid(a).name() << std::endl;
}
運行結果為:
i
只得到了int的縮寫i。
2. 傳統方法打印string類型
#include <iostream>
#include <string>
int main()
{
? std::string a = "abc";
? std::cout << typeid(a).name() << std::endl;
}
運行結果為:
NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
過于冗長,不便于看出類型名稱。
3. 傳統方法打印引用類型
#include <iostream>
int main()
{
? int a0 = 23;
? int& a = a0;
? std::cout << typeid(a).name() << std::endl;
}
運行結果為:
i
并沒有準確地輸出我們想要的結果。
總結:使用了稍微復雜的模板函數,可以準確輸出C++的變量類型,而非大多數人提到的type_id(var).name()打印出來的結果有各種不恰當的地方。
獲取C++數據類型取值范圍
包含頭文件
#include <limits>
#include <float.h>
類型變量定義
int a = 2;//32位整數 4字節 4byte 32bit
unsigned int b = 2u;//無符號32位整數 4字節 4byte 32bit
signed int b1 = -2147483648;//有符號32位整數 4字節 4byte 32bit
long c = 2l;//32位整數 4字節 4byte 32bit
unsigned long d= 2ul;//無符號32位整數 4字節 4byte 32bit
double e = 2.0;//雙精度浮點數
float f = 2.0f;//單精度浮點數
long double g=2.0l;//長雙精度浮點數
long long h=2ll;//超長整數 64位整數 8字節 8byte 64bit
short i = 2;//16位整數 2字節 2byte 16bit
unsigned short i1 = 2;//無符號16位整數 2字節 2byte 16bit
char j = '2';//字符類型 1字節 1byte 8bit
char j1 = '2';//無符號字符類型 1字節 1byte 8bit
取類型值范圍
std::cout <<"int a is :"<< a << " int類型取值范圍:" <<INT_MIN <<","<<INT_MAX <<"\n"
<<"signed int b1 is :"<< b1 << " int類型取值范圍: " <<INT_MIN <<","<<INT_MAX <<"\n"
<<"unsigned int b is : "<<b << " unsigned int類型取值范圍: " <<0 <<","<<UINT_MAX <<"\n"
<<"long c is : "<<c<<" long類型取值范圍: " <<LONG_MIN <<","<<LONG_MAX <<"\n"
<<"unsigned long d is : "<<d<<" unsigned long類型取值范圍: " <<0 <<","<<ULONG_MAX <<"\n"
<<"double e is : "<<e<< " double類型取值范圍:" <<DBL_MIN <<","<<DBL_MAX <<"\n"
<<"float f is : "<<f<<" float類型取值范圍:" <<FLT_MIN <<","<<FLT_MAX <<"\n"
<<"long double g is : "<<g<<" long double類型取值范圍:" <<LDBL_MIN <<","<<LDBL_MAX <<"\n"
<<"long long h is : "<<h<<" long long類型取值范圍: " <<LLONG_MIN <<","<<LLONG_MAX <<"\n"
<<"short i is : "<<i<<" short類型取值范圍: " <<SHRT_MIN <<","<<SHRT_MAX <<"\n"
<<"unsigned short i is : "<<i1<<" unsigned short類型取值范圍: " <<0 <<","<<USHRT_MAX <<"\n"
<<"char j is : "<<j<<" char類型取值范圍: " <<CHAR_MIN <<","<<CHAR_MAX <<"\n"
<<"unsigned char j1 is : "<<j1<<" unsigned char類型取值范圍: " <<0 <<","<<UCHAR_MAX <<"\n";
輸出效果:
int a is :2 ?int類型取值范圍:-2147483648,2147483647
signed int b1 is :-2147483648 ?int類型取值范圍: -2147483648,2147483647
unsigned int b is : 2 ?unsigned int類型取值范圍: 0,4294967295
long c is : 2 ?long類型取值范圍: -9223372036854775808,9223372036854775807
unsigned long d is : 2 ?unsigned long類型取值范圍: 0,18446744073709551615
double e is : 2 ?double類型取值范圍:2.22507e-308,1.79769e+308
float f is : 2 ?float類型取值范圍:1.17549e-38,3.40282e+38
long double g is : 2 ?long double類型取值范圍:3.3621e-4932,1.18973e+4932
long long h is : 2 ?long long類型取值范圍: -9223372036854775808,9223372036854775807
short i is : 2 ?short類型取值范圍: -32768,32767
unsigned short i is : 2 ?unsigned short類型取值范圍: 0,65535
char j is : 2 ?char類型取值范圍: -128,127
unsigned char j1 is : 2 unsigned char類型取值范圍: 0,255
完整代碼
#include <iostream>
#include <chrono>
#include <thread>
#include <limits>
#include <float.h>
int main() {
int a = 2;//32位整數 4字節 4byte 32bit
unsigned int b = 2u;//無符號32位整數 4字節 4byte 32bit
signed int b1 = -2147483648;//有符號32位整數 4字節 4byte 32bit
long c = 2l;//32位整數 4字節 4byte 32bit
unsigned long d= 2ul;//無符號32位整數 4字節 4byte 32bit
double e = 2.0;//雙精度浮點數
float f = 2.0f;//單精度浮點數
long double g=2.0l;//長雙精度浮點數
long long h=2ll;//超長整數 64位整數 8字節 8byte 64bit
short i = 2;//16位整數 2字節 2byte 16bit
unsigned short i1 = 2;//無符號16位整數 2字節 2byte 16bit
char j = '2';//字符類型 1字節 1byte 8bit
char j1 = '2';//無符號字符類型 1字節 1byte 8bit
//進度表示寫法
int bin2 =0b11111111;//二進制 0和1 前綴:0b stdc++ 14
int bin8 = 077;//八進制 0~7 前綴:0
int bin16= 0xff;//十六進制 0~F 前綴:0x
int aa = INT_MAX * 2 + 1;
unsigned int bb = UINT_MAX;
if (aa == bb)
{
std::cout<<UINT_MAX<<std::endl;
}
std::cout <<"int a is :"<< a << " int類型取值范圍:" <<INT_MIN <<","<<INT_MAX <<"\n"
<<"signed int b1 is :"<< b1 << " int類型取值范圍: " <<INT_MIN <<","<<INT_MAX <<"\n"
<<"unsigned int b is : "<<b << " unsigned int類型取值范圍: " <<0 <<","<<UINT_MAX <<"\n"
<<"long c is : "<<c<<" long類型取值范圍: " <<LONG_MIN <<","<<LONG_MAX <<"\n"
<<"unsigned long d is : "<<d<<" unsigned long類型取值范圍: " <<0 <<","<<ULONG_MAX <<"\n"
<<"double e is : "<<e<< " double類型取值范圍:" <<DBL_MIN <<","<<DBL_MAX <<"\n"
<<"float f is : "<<f<<" float類型取值范圍:" <<FLT_MIN <<","<<FLT_MAX <<"\n"
<<"long double g is : "<<g<<" long double類型取值范圍:" <<LDBL_MIN <<","<<LDBL_MAX <<"\n"
<<"long long h is : "<<h<<" long long類型取值范圍: " <<LLONG_MIN <<","<<LLONG_MAX <<"\n"
<<"short i is : "<<i<<" short類型取值范圍: " <<SHRT_MIN <<","<<SHRT_MAX <<"\n"
<<"unsigned short i is : "<<i1<<" unsigned short類型取值范圍: " <<0 <<","<<USHRT_MAX <<"\n"
<<"char j is : "<<j<<" char類型取值范圍: " <<CHAR_MIN <<","<<CHAR_MAX <<"\n"
<<"unsigned char j1 is : "<<j1<<" unsigned char類型取值范圍: " <<0 <<","<<UCHAR_MAX <<"\n";
std::cout<<"二進制0b11111111值是:"<<bin2<<std::endl;
std::cout<<"八進制077值是:"<<bin8<<std::endl;
std::cout<<"十六進制0xff值是:"<<bin16<<std::endl;
std::cout << "等待5秒后退出程序" <<std::endl;
std::this_thread::sleep_for(std::chrono::seconds(5));
return 0;
}
原文鏈接:https://blog.csdn.net/sky4403/article/details/123028385
相關推薦
- 2023-05-17 Android?Lock鎖實現原理詳細分析_Android
- 2022-08-06 Qt編寫顯示密碼強度的控件_C 語言
- 2022-11-11 C++?左值引用與一級指針示例詳解_C 語言
- 2023-05-30 Pandas.DataFrame的行名和列名的修改_python
- 2022-06-22 C語言詳解如何實現堆及堆的結構與接口_C 語言
- 2022-09-17 利用Python提取PDF文本的簡單方法實例_python
- 2022-06-25 PyTorch模型保存與加載實例詳解_python
- 2023-01-31 C#實現偽裝文件夾功能_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支