我的编程空间,编程开发者的网络收藏夹
学习永远不晚

获取C++变量类型的简单方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

定义了一个模板函数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;
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

获取C++变量类型的简单方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

获取MySQL中变量的类型?

无法获取 MySQL 中变量的类型。使用 CAST 运算符将变量的类型转换为另一个类型。语法如下 -SET @yourVariableName:=’anyValue’使用 CAST 运算符转换为另一种类型。语法如下
2023-10-22

Golang反射获取变量类型和值的方法详解

反射是程序在运行期间获取变量的类型和值、或者执行变量的方法的能力。这篇文章主要为大家介绍了Golang反射获取变量类型和值的方法,需要的可以参考一下
2022-12-08

golang获取变量或对象类型的几种方式总结

在golang中并没有提供内置函数来获取变量的类型,但是通过一定的方式也可以获取,下面这篇文章主要给大家介绍了关于golang获取变量或对象类型的几种方式,需要的朋友可以参考下
2022-12-26

Android简单获取经纬度的方法

本文实例讲述了Android简单获取经纬度的方法。分享给大家供大家参考,具体如下:public void getLoc() {// 位置LocationManager locationManager;LocationListener loc
2022-06-06

获取cookie的简单方法(电脑端)

获取cookie 首先科普一下Cookie是什么 百度搜索的官方解释如下: Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加
2023-08-20

java反射遍历实体类属性和类型,并赋值和获取值的简单方法

实例如下:import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;i
2023-05-31

怎么在python中使用super方法获取类变量

这篇文章给大家介绍怎么在python中使用super方法获取类变量,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题,而不是搞明
2023-06-14

Java中获取泛型类型信息的方法

本文主要介绍了Java中获取泛型类型信息的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-08

Shell eval通过变量获取环境变量的方法实现

场景系统中存在环境变量 USER=iceber脚本中存在一个变量 env_name=USER需要通过变量 env_name 获取到环境变量 USER rvLjqm的值错误示例$ # 环境中已存在环境变量 USER $ ervLjqmnv_n
2022-06-04

Python简单获取自身外网IP的方法

本文实例讲述了Python简单获取自身外网IP的方法。分享给大家供大家参考,具体如下:#encoding=utf-8 #author: walker #date: 2016-03-07 #function: 获取自己的外网IP import
2022-06-04

JavaScript变量类型有哪些及变量间的转换方法

这篇文章主要介绍“JavaScript变量类型有哪些及变量间的转换方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript变量类型有哪些及变量间的转换方法”文章能帮助大家解决问题。1.
2023-06-29

python获取list下标及其值的简单方法

当在python中遍历一个序列时,我们通常采用如下的方法: for item in sequence:process(item)如果要取到某个item的位置,可以这样写:for index in range(len(sequence)):p
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录