前言

当指向类的指针转换好几次的时候,人为看过去雀食很累了,就可以用typeid去看这个变量的类型。


正文

1
2
3
4
5
6
7
8
9
10
#include<iostream>


int main(){

int a;
std::cout << typeid(a).name();

return 0;
}

最直接的情况

但是有个别变量的处理不是很好,比如long long

他显示的是__int64

还有的就是不是所有的编译器都默认打开这个功能。


检测多态类型

指针类型

1
2
3
4
5
class father{};

class son : public father{};

class grandson:public son{};

设计三个类

1
2
3
4
father *fa = new father();
fa = new grandson();

std::cout << typeid(fa).name();

看到返回的是类的指针类型,而不是正常的类型。
因为需要解除引用,转出类型。

1
2
3
4
father *fa = new father();
fa = new grandson();

std::cout << typeid(*fa).name();

到此还不是最理想的类型显示。他显示的还是他最早声明的类型,但是我们new过之后,应该让他显示我们new之后的类型。

原因是类不支持多态,类型不会动态转换,所以往基类里面加个虚函数。

1
2
3
4
5
6
7
8
9
10
class father{
public:
virtual void test(){

}
};

class son : public father{};

class grandson:public son{};

再次打印看到结果是我们最后一次new的类型了。

注意要用星号解引用,不然还是它定义的类型


引用类型

1
2
3
son s1;
father &fa = s1;
std::cout << typeid(fa).name();

可以看到直接打印出了s1的类型。

并且修改成grandson也是没问题

首先引用是个弱化的指针,它不需要像指针那样还要单独解引用。


无聊的比较

估计会好奇typeid返回的是不是字符串,如果是也就能拿来和字符串比较。

这样肯定是不合法的。

可以看到显然typeid的返回值不会是const char。

那么最简单的就是两个typeid互相比较

比较类型当然少不了类。

虽然name是const char*,但是和字符串比较没有结果,而且也不合适,还是直接调用现场的好了


结语

typeid没啥问题,凑合用。