最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

獲取C++變量類型的簡單方法

 更新時間:2022年09月28日 09:55:11   作者:漫游宇宙sky  
這篇文章主要介紹了獲取C++變量類型的簡單方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

獲取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;
}

定義了一個模板函數(shù)type_name(),可以對傳入的模板類型T進行類型判斷,結(jié)合指針、左值/右值引用、常類型,準確得出變量的類型。在調(diào)用該函數(shù)時使用了decltype關(guān)鍵字,傳入待確定的變量,然后輸出變量類型。

以上運行的結(jié)果為

int const&

如果要輸出int指針的類型:

int main()
{
? ? int a = 1;
? ? int* b = &a;
? ? cout << type_name<decltype(b)>() << endl;
}

結(jié)果為:

int*

可以看出該函數(shù)得出的結(jié)果是非常準確而又精簡的。

與傳統(tǒng)方法的對比

傳統(tǒng)輸出C++類型的方法是使用typeid(var).name(),其弊端在于輸出的結(jié)果不完整或者過于冗長。

例如:

1. 傳統(tǒng)方法打印int類型

#include <iostream>

int main()
{
? int a = 10;
? std::cout << typeid(a).name() << std::endl;
}

運行結(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;
}

運行結(jié)果為:

NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

過于冗長,不便于看出類型名稱。

3. 傳統(tǒng)方法打印引用類型

#include <iostream>

int main()
{
? int a0 = 23;
? int& a = a0;
? std::cout << typeid(a).name() << std::endl;
}

運行結(jié)果為:

i

并沒有準確地輸出我們想要的結(jié)果。

總結(jié):使用了稍微復雜的模板函數(shù),可以準確輸出C++的變量類型,而非大多數(shù)人提到的type_id(var).name()打印出來的結(jié)果有各種不恰當?shù)牡胤健?/p>

獲取C++數(shù)據(jù)類型取值范圍

包含頭文件

#include <limits>
#include <float.h>

類型變量定義

int a = 2;//32位整數(shù) 4字節(jié) 4byte  32bit
    unsigned int b = 2u;//無符號32位整數(shù)  4字節(jié) 4byte  32bit
    signed int b1 = -2147483648;//有符號32位整數(shù)  4字節(jié) 4byte  32bit
    long c = 2l;//32位整數(shù) 4字節(jié) 4byte  32bit
    unsigned long d= 2ul;//無符號32位整數(shù) 4字節(jié) 4byte  32bit
    double e = 2.0;//雙精度浮點數(shù)
    float f = 2.0f;//單精度浮點數(shù)
    long double g=2.0l;//長雙精度浮點數(shù)
    long long h=2ll;//超長整數(shù) 64位整數(shù) 8字節(jié) 8byte  64bit
    short i = 2;//16位整數(shù) 2字節(jié) 2byte  16bit
    unsigned short i1 = 2;//無符號16位整數(shù) 2字節(jié) 2byte  16bit
    char j = '2';//字符類型 1字節(jié) 1byte  8bit
    char j1 = '2';//無符號字符類型 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;//無符號32位整數(shù)  4字節(jié) 4byte  32bit
    signed int b1 = -2147483648;//有符號32位整數(shù)  4字節(jié) 4byte  32bit
    long c = 2l;//32位整數(shù) 4字節(jié) 4byte  32bit
    unsigned long d= 2ul;//無符號32位整數(shù) 4字節(jié) 4byte  32bit
    double e = 2.0;//雙精度浮點數(shù)
    float f = 2.0f;//單精度浮點數(shù)
    long double g=2.0l;//長雙精度浮點數(shù)
    long long h=2ll;//超長整數(shù) 64位整數(shù) 8字節(jié) 8byte  64bit
    short i = 2;//16位整數(shù) 2字節(jié) 2byte  16bit
    unsigned short i1 = 2;//無符號16位整數(shù) 2字節(jié) 2byte  16bit
    char j = '2';//字符類型 1字節(jié) 1byte  8bit
    char j1 = '2';//無符號字符類型 1字節(jié) 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;
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言中 & 和 &&的區(qū)別詳解

    C語言中 & 和 &&的區(qū)別詳解

    這篇文章主要介紹了C語言中 & 和 &&的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • QT實現(xiàn)簡單打地鼠游戲

    QT實現(xiàn)簡單打地鼠游戲

    這篇文章主要為大家詳細介紹了QT實現(xiàn)簡單打地鼠游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C語言中無符號與有符號及相加問題

    C語言中無符號與有符號及相加問題

    這篇文章主要介紹了C語言中無符號與有符號及相加問題,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • C語言數(shù)據(jù)結(jié)構(gòu)與算法之鏈表(二)

    C語言數(shù)據(jù)結(jié)構(gòu)與算法之鏈表(二)

    在這篇文章中,我們將拋開令人頭禿的指針和結(jié)構(gòu)體,我們將另外使用一種數(shù)組來實現(xiàn)的方式,叫做模擬鏈表。讓來跟隨小編一起學習學習吧
    2021-12-12
  • C語言入門之浮點數(shù)

    C語言入門之浮點數(shù)

    這篇文章主要為大家介紹了C語言的浮點數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • C語言中的字符型數(shù)據(jù)與ASCII碼表

    C語言中的字符型數(shù)據(jù)與ASCII碼表

    這篇文章主要介紹了C語言中的字符型數(shù)據(jù)與ASCII碼表,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 自己簡單封裝的一個CDialog類實例

    自己簡單封裝的一個CDialog類實例

    這篇文章主要介紹了自己簡單封裝的一個CDialog類,實例分析了自定義封裝CDialog類的相關(guān)技巧,比較簡單易懂,需要的朋友可以參考下
    2015-04-04
  • C++通過SQLiteSDK增刪改查的實現(xiàn)示例

    C++通過SQLiteSDK增刪改查的實現(xiàn)示例

    SQLite是一種輕量級的嵌入式數(shù)據(jù)庫,可以利用SQLiteSDK執(zhí)行數(shù)據(jù)庫的增刪改查操作,本文主要介紹了C++通過SQLiteSDK增刪改查,具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • 詳解C++11 變參模板

    詳解C++11 變參模板

    這篇文章主要介紹了C++11 變參模板的相關(guān)資料,幫助大家更好的理解和學習c++11,感興趣的朋友可以了解下
    2020-08-08
  • C/C++中退出線程的四種解決方法

    C/C++中退出線程的四種解決方法

    本篇文章是對C/C++中退出線程的四種解決方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05

最新評論

林甸县| 临西县| 桑植县| 亳州市| 同仁县| 米泉市| 南澳县| 亳州市| 栖霞市| 宝应县| 和田县| 潜江市| 北川| 嵩明县| 郯城县| 宁城县| 天等县| 新津县| 密山市| 建始县| 茂名市| 武汉市| 安仁县| 潮安县| 夏邑县| 龙胜| 德安县| 茶陵县| 永泰县| 崇明县| 金寨县| 游戏| 荔波县| 荔浦县| 重庆市| 庆云县| 锡林郭勒盟| 连平县| 当涂县| 北辰区| 金门县|