獲取C++變量類型的簡(jiǎn)單方法
獲取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; }
定義了一個(gè)模板函數(shù)type_name(),可以對(duì)傳入的模板類型T進(jìn)行類型判斷,結(jié)合指針、左值/右值引用、常類型,準(zhǔn)確得出變量的類型。在調(diào)用該函數(shù)時(shí)使用了decltype關(guān)鍵字,傳入待確定的變量,然后輸出變量類型。
以上運(yùn)行的結(jié)果為
int const&
如果要輸出int指針的類型:
int main() { ? ? int a = 1; ? ? int* b = &a; ? ? cout << type_name<decltype(b)>() << endl; }
結(jié)果為:
int*
可以看出該函數(shù)得出的結(jié)果是非常準(zhǔn)確而又精簡(jiǎn)的。
與傳統(tǒng)方法的對(duì)比
傳統(tǒng)輸出C++類型的方法是使用typeid(var).name(),其弊端在于輸出的結(jié)果不完整或者過于冗長(zhǎng)。
例如:
1. 傳統(tǒng)方法打印int類型
#include <iostream> int main() { ? int a = 10; ? std::cout << typeid(a).name() << std::endl; }
運(yùn)行結(jié)果為:
i
只得到了int的縮寫i。
2. 傳統(tǒng)方法打印string類型
#include <iostream> #include <string> int main() { ? std::string a = "abc"; ? std::cout << typeid(a).name() << std::endl; }
運(yùn)行結(jié)果為:
NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
過于冗長(zhǎng),不便于看出類型名稱。
3. 傳統(tǒng)方法打印引用類型
#include <iostream> int main() { ? int a0 = 23; ? int& a = a0; ? std::cout << typeid(a).name() << std::endl; }
運(yùn)行結(jié)果為:
i
并沒有準(zhǔn)確地輸出我們想要的結(jié)果。
總結(jié):使用了稍微復(fù)雜的模板函數(shù),可以準(zhǔn)確輸出C++的變量類型,而非大多數(shù)人提到的type_id(var).name()打印出來的結(jié)果有各種不恰當(dāng)?shù)牡胤健?/p>
獲取C++數(shù)據(jù)類型取值范圍
包含頭文件
#include <limits> #include <float.h>
類型變量定義
int a = 2;//32位整數(shù) 4字節(jié) 4byte 32bit unsigned int b = 2u;//無符號(hào)32位整數(shù) 4字節(jié) 4byte 32bit signed int b1 = -2147483648;//有符號(hào)32位整數(shù) 4字節(jié) 4byte 32bit long c = 2l;//32位整數(shù) 4字節(jié) 4byte 32bit unsigned long d= 2ul;//無符號(hào)32位整數(shù) 4字節(jié) 4byte 32bit double e = 2.0;//雙精度浮點(diǎn)數(shù) float f = 2.0f;//單精度浮點(diǎn)數(shù) long double g=2.0l;//長(zhǎng)雙精度浮點(diǎn)數(shù) long long h=2ll;//超長(zhǎng)整數(shù) 64位整數(shù) 8字節(jié) 8byte 64bit short i = 2;//16位整數(shù) 2字節(jié) 2byte 16bit unsigned short i1 = 2;//無符號(hào)16位整數(shù) 2字節(jié) 2byte 16bit char j = '2';//字符類型 1字節(jié) 1byte 8bit char j1 = '2';//無符號(hào)字符類型 1字節(jié) 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位整數(shù) 4字節(jié) 4byte 32bit unsigned int b = 2u;//無符號(hào)32位整數(shù) 4字節(jié) 4byte 32bit signed int b1 = -2147483648;//有符號(hào)32位整數(shù) 4字節(jié) 4byte 32bit long c = 2l;//32位整數(shù) 4字節(jié) 4byte 32bit unsigned long d= 2ul;//無符號(hào)32位整數(shù) 4字節(jié) 4byte 32bit double e = 2.0;//雙精度浮點(diǎn)數(shù) float f = 2.0f;//單精度浮點(diǎn)數(shù) long double g=2.0l;//長(zhǎng)雙精度浮點(diǎn)數(shù) long long h=2ll;//超長(zhǎng)整數(shù) 64位整數(shù) 8字節(jié) 8byte 64bit short i = 2;//16位整數(shù) 2字節(jié) 2byte 16bit unsigned short i1 = 2;//無符號(hào)16位整數(shù) 2字節(jié) 2byte 16bit char j = '2';//字符類型 1字節(jié) 1byte 8bit char j1 = '2';//無符號(hào)字符類型 1字節(jié) 1byte 8bit //進(jìn)度表示寫法 int bin2 =0b11111111;//二進(jìn)制 0和1 前綴:0b stdc++ 14 int bin8 = 077;//八進(jìn)制 0~7 前綴:0 int bin16= 0xff;//十六進(jìn)制 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<<"二進(jìn)制0b11111111值是:"<<bin2<<std::endl; std::cout<<"八進(jìn)制077值是:"<<bin8<<std::endl; std::cout<<"十六進(jìn)制0xff值是:"<<bin16<<std::endl; std::cout << "等待5秒后退出程序" <<std::endl; std::this_thread::sleep_for(std::chrono::seconds(5)); return 0; }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++關(guān)鍵字thread_local學(xué)習(xí)筆記
這篇文章主要為大家介紹了C++關(guān)鍵字thread_local學(xué)習(xí)筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10C語言詳細(xì)講解strcpy strcat strcmp函數(shù)的模擬實(shí)現(xiàn)
這篇文章主要介紹了怎樣用C語言模擬實(shí)現(xiàn)strcpy與strcat和strcmp函數(shù),strcpy()函數(shù)是C語言中的一個(gè)復(fù)制字符串的庫(kù)函數(shù),strcat()函數(shù)的功能是實(shí)現(xiàn)字符串的拼接,strcmp()函數(shù)作用是比較字符串str1和str2是否相同2022-05-05C++實(shí)現(xiàn)線性代數(shù)矩陣行簡(jiǎn)化
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)線性代數(shù)矩陣行簡(jiǎn)化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02