当前位置: 首页 > article >正文

C++中的typeid使用方法

class base
{
public:
	virtual ~base()
	{

	}
};

class derived : public base
{
public:
	virtual ~derived()
	{

	}
};

上边代码说明了derived和base之间的关系

int a = 1;
string s = "hello world";
int& b = a;
int&& c = 10;
int* pa = &a;

cout << typeid(a).name() << endl;
//输出int

cout << typeid(b).name() << endl;
//输出int

cout << typeid(c).name() << endl;
//输出int

cout << typeid(pa).name() << endl;
//输出int * __ptr64

cout << typeid(s).name() << endl;
//输出class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >

由上述代码可知,typeid().name()可以识别出变量类型,但是对于左值引用和右值引用都是直接输出的其母体的数据类型

除此之外,typeid().name()还可以输出自定义的变量类型

base father;
cout << typeid(father).name() << endl;
//输出class base

但要注意的是:

derived child;
base& cf = child;
cout << typeid(cf).name() << endl;
//输出class derived

在实现了多态后, typeid(父类引用(引用的是子类对象)).name() 输出的是该父类引用指向的子类对象的类型名

typeid().name()的返回值char const* __ptr64

cout << typeid(typeid(child).name()).name() << endl;
//输出char const * __ptr64

因此可以通过其来判断两个对象的类型是否相等

if (typeid(child).name() == typeid(cf).name())
{
	cout << 1 << endl;
}
//输出1

类模版也同样适用!

template<class T>
struct base
{
	virtual ~base()
	{

	}
};

template<class T>
struct derived : public base<T>
{
	virtual ~derived()
	{

	}
};

int main()
{
	base<int> father;
	derived<int> child;

	base<int>& cf = child;

	cout << typeid(father).name() << endl;
	//输出struct base<int>

	cout << typeid(cf).name() << endl;
	//输出struct derived<int>

	return 0;
}

总结:typeid().name()可以返回对应变量的类型,()里边可以是类型名,也可以是变量名。除此之外,还可以用其来判断两个对象类型是否相等(对模板也生效)。
注:typeid().name()中的参数如果是引用了子类对象的父类引用,那么其返回的是对应子类的类型(但是必须要实现多态)。


http://www.kler.cn/a/320784.html

相关文章:

  • 蓝桥杯介绍
  • LabVIEW中的UDP与TCP比较
  • ES6标准-Promise对象
  • 遇到 mysql_config not found 错误
  • 【网络安全面经】OSI七层模型每层都有什么协议
  • 项目配置文件选择(Json,xml,Yaml, INI)
  • Mac优化清理工具CleanMyMac X 4.15.6 for mac中文版
  • c++:set和map
  • 脉冲式投币器与售货机主板RS232连接WF-700B适配器介绍
  • 程序编译的四个阶段
  • python 异步读取文件,速度变快了吗
  • Linux Centos7达梦8数据库安装说明(附安装包,超详细图文!)收藏这一篇就够了!
  • 基于quill2.0的富文本编辑器,Fluent Editor,支持表格,图片,表情等
  • 中间添加一条可以拖拽的分界线,来动态调整两个模块的宽度
  • 如何在调试状态下部署局域网网站
  • Qt C++设计模式->外观模式
  • 牛骨髓油茶,美味不可错过
  • 华为机考练习(golang)
  • 算法.图论-并查集
  • C++:string类写时拷贝|引用计数
  • git使用方法详解(适合新手)
  • 找免费正版高清图片,就上这8个网站。
  • 深度拆解:如何在Facebook上做跨境电商?
  • 【docker】debian中配置docker(2024年9月)
  • YOLOv8-pose+streamlit 实现人体关键点检测/姿态估计系统(后续可用于健身时的姿态估计,训练纠正等....)
  • 智算中心动环监控:构建高效、安全的数字基础设施@卓振思众