通过 typeid(v).name() 获取各类C++变量类型
前言
在 Python 中,想要获取变量类型通过 type()
来获取非常方便,打印也十分清晰。虽然 C++ 是显式定义变量,但是有时候我们想通过变量名来获取数据类型,就不如 Python 方便了。
在 C++ 中,想要通过变量名来获取数据类型,可以使用 typeid(var).name()
来获取,但是缺点是输出形式比较难以辨识。在这里,我们对 C++ 的所有数据类型进行一下总结,顺便也便于以后查阅。
需要注意的是,此函数需要 #include<typeinfo>
,并且不同的编译器下会有不同的显示,这里以 G++ 的编译结果为例。
运行结果
首先是运行结果:
整数
char 类型显示为: c
short 类型显示为: s
int 类型显示为: i
long 类型显示为: l
long long 类型显示为: x
int8_t 类型显示为: a
int16_t 类型显示为: s
int32_t 类型显示为: i
int64_t 类型显示为: l
正整数
unsigned char 类型显示为: h
unsigned short 类型显示为: t
unsigned int 类型显示为: j
unsigned long 类型显示为: m
unsigned long long 类型显示为: y
uint8_t 类型显示为: h
uint16_t 类型显示为: t
uint32_t 类型显示为: j
uint64_t 类型显示为: m
浮点
float 类型显示为: f
double 类型显示为: d
数组(数组与长度有关)
char[] 类型显示为: A1_c
short[] 类型显示为: A2_s
int[] 类型显示为: A3_i
long[] 类型显示为: A4_l
long long[] 显示为: A100_x
float[] 类型显示为: A2_f
double[] 类型显示为: A2_d
vector<int> 为: St6vectorIiSaIiEE // 注意这里的i
vector<double> 为: St6vectorIdSaIdEE // 注意这里的d
string 类型显示为: NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
指针(前面加P)
int* 类型显示为: Pi
double* 类型显示为: Pd
double** 类型显示为: PPd
指针数组 类型显示为: A3_Pd // double* v[3]
数组指针 类型显示为: PA3_d // double (*v)[3]
string* 类型显示为: PNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
std::vector<double>* 为: PSt6vectorIdSaIdEE
std::vector<string>* 为: PSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS5_EE
自定义类型
struct 类型显示为: 8V_struct
struct 初始化后为: 8V_struct
class 类型显示为: 7V_class
object 类型显示为: 7V_class
function 类型显示为: FvvE
代码
#include <iostream>
#include <typeinfo>
#include <vector>
using namespace std;
class V_class{};
struct V_struct{};
void v_func(){}
int main()
{
// 以下所有变量的测试通过括号括起来,定义的变量为局部变量,就可以重名了,省去了起名字的烦恼
// 整数类别
{
char v(0);
cout << "char 类型显示为:\t" << typeid(v).name() << endl;
}
{
short v(0);
cout << "short 类型显示为:\t" << typeid(v).name() << endl;
}
{
int v(0);
cout << "int 类型显示为:\t" << typeid(v).name() << endl;
}
{
long v(0);
cout << "long 类型显示为:\t" << typeid(v).name() << endl;
}
{
long long v(0);
cout << "long long 类型显示为:\t" << typeid(v).name() << endl;
}
cout << endl;
{
int8_t v(0);
cout << "int8_t 类型显示为:\t" << typeid(v).name() << endl;
}
{
int16_t v(0);
cout << "int16_t 类型显示为:\t" << typeid(v).name() << endl;
}
{
int32_t v(0);
cout << "int32_t 类型显示为:\t" << typeid(v).name() << endl;
}
{
int64_t v(0);
cout << "int64_t 类型显示为:\t" << typeid(v).name() << endl;
}
cout << endl;
// 正整数类别
{
unsigned char v(0);
cout << "unsigned char 类型显示为:\t" << typeid(v).name() << endl;
}
{
unsigned short v(0);
cout << "unsigned short 类型显示为:\t" << typeid(v).name() << endl;
}
{
unsigned int v(0);
cout << "unsigned int 类型显示为:\t" << typeid(v).name() << endl;
}
{
unsigned long v(0);
cout << "unsigned long 类型显示为:\t" << typeid(v).name() << endl;
}
{
unsigned long long v(0);
cout << "unsigned long long 类型显示为:\t" << typeid(v).name() << endl;
}
cout << endl;
{
uint8_t v(0);
cout << "uint8_t 类型显示为:\t" << typeid(v).name() << endl;
}
{
uint16_t v(0);
cout << "uint16_t 类型显示为:\t" << typeid(v).name() << endl;
}
{
uint32_t v(0);
cout << "uint32_t 类型显示为:\t" << typeid(v).name() << endl;
}
{
uint64_t v(0);
cout << "uint64_t 类型显示为:\t" << typeid(v).name() << endl;
}
cout << endl;
// 浮点数类别
{
float v(0);
cout << "float 类型显示为:\t" << typeid(v).name() << endl;
}
{
double v(0);
cout << "double 类型显示为:\t" << typeid(v).name() << endl;
}
cout << endl;
// 数组类别
{
char v[] = {0};
cout << "char[] 类型显示为:\t" << typeid(v).name() << endl;
}
{
short v[] = {0,0};
cout << "short[] 类型显示为:\t" << typeid(v).name() << endl;
}
{
int v[] = {0,0,0};
cout << "int[] 类型显示为:\t" << typeid(v).name() << endl;
}
{
long v[] = {0,0,0,0};
cout << "long[] 类型显示为:\t" << typeid(v).name() << endl;
}
{
long long v[100] = {0};
cout << "long long[] 显示为:\t" << typeid(v).name() << endl;
}
{
float v[] = {0.0f,0.0f};
cout << "float[] 类型显示为:\t" << typeid(v).name() << endl;
}
{
double v[] = {0.0,0.0};
cout << "double[] 类型显示为:\t" << typeid(v).name() << endl;
}
// 容器类别
{
vector<int> v(20,1);
cout << "vector<int> 为:\t" << typeid(v).name() << endl;
}
{
vector<double> v(20,1);
cout << "vector<double> 为:\t" << typeid(v).name() << endl;
}
// 字符串类别
{
string v("hello");
cout << "string 类型显示为:\t" << typeid(v).name() << endl;
// 可以看到,显示的内容与长短无关
}
cout << endl;
// 指针类别
{
int* v;
cout << "int* 类型显示为:\t" << typeid(v).name() << endl;
}
{
double* v;
cout << "double* 类型显示为:\t" << typeid(v).name() << endl;
}
{
double** v;
cout << "double** 类型显示为:\t" << typeid(v).name() << endl;
}
{
// 指针数组
double* v[3];
cout << "指针数组 类型显示为:\t" << typeid(v).name() << endl;
}
{
// 数组指针
double (*v)[3];
cout << "数组指针 类型显示为:\t" << typeid(v).name() << endl;
}
{
string* v;
cout << "string* 类型显示为:\t" << typeid(v).name() << endl;
}
{
vector<double>* v;
cout << "vector<double>* 为:\t" << typeid(v).name() << endl;
}
{
vector<string>* v;
cout << "vector<string>* 为:\t" << typeid(v).name() << endl;
}
cout << endl;
// 结构体类别
{
cout << "struct 类型显示为:\t" << typeid(V_struct).name() << endl;
}
// 结构体类别
{
V_struct v_struct;
cout << "struct 初始化后为:\t" << typeid(v_struct).name() << endl;
}
// 类
{
cout << "class 类型显示为:\t" << typeid(V_class).name() << endl;
}
// 对象
{
V_class v_class;
cout << "object 类型显示为:\t" << typeid(v_class).name() << endl;
}
// 函数类别
{
cout << "function 类型显示为:\t" << typeid(v_func).name() << endl;
}
return 0;
}