C++编程法则365天一天一条(24)RTTI运行时类型信息typeid和type_info

文章目录

  • 基本用法
  • 编译时或运行时判定

基本用法

typeid 是 C++ 的一个运算符,它用于获取表达式的类型信息。它返回一个 std::type_info 对象引用,该对象包含有关表达式的类型的信息。

要使用 typeid 运算符,需要包含 <typeinfo> 头文件,并使用表达式作为其操作数。通常,可以将变量、对象或类型名称作为表达式。

如果表达式的类型是类类型且至少包含有一个虚函数,则typeid操作符返回表达式的动态类型,需要在运行时计算;
否则,typeid操作符返回表达式的静态类型,在编译时就可以计算。

ISO C++标准并没有确切定义type_info,它的确切定义编译器相关的,但是标准却规定了其实现必需提供如下四种操作(在之后的章节中我会来分析type_info类文件的源码)

运算描述
t1 == t2如果两个对象t1和t2类型相同,则返回true;否则返回false
t1 != t2如果两个对象t1和t2类型不同,则返回true;否则返回false
t.name()返回类型的C-style字符串,类型名字用系统相关的方法产生1
t1.before(t2)返回指出t1是否出现在t2之前的bool值

type_info包含了一个虚析构,因为它通常是作为类型的基类,其实现比较简单:

class type_info {
  
    protected:
    	const char* __name;
    
        explicit type_info(const char* __n) : __name(_n) {}
};

借助了程序内存地址的唯一性来判别两个类型是否相等。

以下是使用 typeid 的示例:

#include <iostream>
#include <typeinfo>

class MyClass {
public:
    int a;
    double b;
};

int main() {
    int num;
    MyClass obj;

    const std::type_info& numType = typeid(num);
    const std::type_info& objType = typeid(obj);

    std::cout << "Type of num: " << numType.name() << std::endl;
    std::cout << "Type of obj: " << objType.name() << std::endl;

    return 0;
}

在上述代码中,我们使用 typeid 运算符分别获取了变量 num 和对象 obj 的类型信息。

在这里插入图片描述

编译时或运行时判定

如果对象没有多态性质的话,可以在编译时期就决定它的对象类型:

class Point {
  private:
    int x_;
}

class Point2D : public Point {
  private:
    int y_;
}

int main() {
  Point* p = new Point2D();
  assert(typid(*p) == typeid(Point));
}

对于存在多态的类型,会在运行时判定:

class Point {
  virtual ~Point();

  private:
    int x_;
}

class Point2D : public Point {
  private:
    int y_;
}

int main() {
  Point* p = new Point2D();
  assert(typid(*p) == typeid(Point2D));
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/232788.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Realme X7 Pro Root 刷机教程

Realme X7 Pro 刷机教程 Just For Fun&#xff0c;最近倒腾了下Realme X7 Pro 刷root。此博客为个人记录刷机过程&#xff0c;如有机友跟随本教程操作&#xff0c;请谨慎操作&#xff01;&#xff01;&#xff01; 以下教程真针对Realme X7 Pro&#xff0c;其他版本方法未知&…

Jmeter性能测试入门 -——性能插件介绍

一、前言 1、首先&#xff0c;JMeter提供了三个基本的线程组&#xff0c;分别为: Thread Group setUp Thread Group tearDown Thread Group 2、其他线程组可以通过集成插件的方式使用&#xff0c;包括&#xff1a; bzm - Arrivals Thread Group bzm - Concurrency Thread Group…

【Linux】如何对文本文件进行有条件地划分?——cut命令

cut 命令可以根据一个指定的标记&#xff08;默认是 tab&#xff09;来为文本划分列&#xff0c;然后将此列显示。 例如想要显示 passwd 文件的第一列可以使用以下命令&#xff1a;cut –f 1 –d : /etc/passwd cut&#xff1a;用于从文件的每一行中提取部分内容的命令。-f 1&…

【postgresql】ERROR: INSERT has more expressions than target columns

执行下面sql insert into apply_account_cancellation3 select * from pply_account_cancellation; 返回下面错误信息 insert into apply_account_cancellation3 select * from apply_account_cancellation > ERROR: INSERT has more expressions than target colu…

优麒麟ubuntukylin安装UE4.27.2

优麒麟ubuntukylin安装UE4.27.2 在&#xff08;国产&#xff09;优麒麟 ubuntukylin Linux平台上编译测试安装虚幻引擎。 优麒麟系统 这里选择的是官方增强版 https://www.ubuntukylin.com/downloads/ 同样的可以选择对应的Ubuntu22.04 LTS&#xff0c;唯一的区别就是优麒麟…

RK3568平台开发系列讲解(Linux系统篇)中断属性解析

🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍通过设备树中的解析。 一、interrupts interrupts 属性用于指定设备的中断相关信息。它描述了中断控制器的类型、中断号以及中断触发类型。下面将对 interrupts 属性的各个方面进行介绍。…

【深度学习】强化学习(三)强化学习的目标函数

文章目录 一、强化学习问题1、交互的对象2、强化学习的基本要素3、策略&#xff08;Policy&#xff09;4、马尔可夫决策过程5、强化学习的目标函数1. 总回报&#xff08;Return&#xff09;2. 折扣回报&#xff08;Discounted Return&#xff09;a. 折扣率b. 折扣回报的定义 3.…

BUUCTF crypto做题记录(3)新手向

目录 一、Rabbit 二、篱笆墙的影子 三、丢失的MD5 四、Alice与Bob 一、Rabbit 得到的密文&#xff1a;U2FsdGVkX1/ydnDPowGbjjJXhZxm2MP2AgI 依旧是看不懂是什么编码&#xff0c;上网搜索&#xff0c;在侧栏发现Rabbit解码&#xff0c;直接搜索就能有在线解码网站 二、篱笆…

Vulnhub-DC-2 靶机复现完整过程

环境准备&#xff1a; kali: NAT模式 网段 &#xff1a;192.168.200.0 DC-2: NAT模式 网段 &#xff1a;192.168.200.0 保证靶机和攻击机在一个网段上 信息收集 收集同网段存货主机IP地址 nmap -sP ip地址 arp-scan -l显示错误页面&#xff0c;显然是重定向错误&#xff0c…

电工--集成运算放大器

目录 集成运算放大器的简单介绍 运算放大器在信号运算方面的应用 比例运算 反相输入 同相输入 加法运算 减法运算 积分运算 微分运算 集成运算放大器的简单介绍 线性区 虚断&#xff1a; 虚短&#xff1a; 运算放大器在信号运算方面的应用 比例运算 反相…

进网TLC认证CE传导骚扰测试分析整改事例

1.1 设备是一款基于CAT1通信的电子产品&#xff0c;在做CE传导骚扰时低频超标异常 1.1.1 从上面测试数据图看&#xff0c;低于3MHz明显已超标。 1.2 什么是CE传导骚扰 电子设备一般主要测试150K~30MHz这个频段的骚扰大小。它是对设备电源线、信号线等产生的一些杂波对外辐射出…

《三十》模块化打包构建工具 Rollup

19的2小时06分钟 Rollup 是一个 JavaScript 的模块化打包工具&#xff0c;可以帮助编译微小的代码到庞大的复杂的代码中&#xff08;例如一个库或者一个应用程序&#xff09;。 Rollup 和 Webpack 的区别&#xff1a; Rollup 也是一个模块化的打包工具&#xff0c;但是它主要…

联合体和枚举

联合体&#xff1a; 联合体是什么&#xff1f; 联合体也是一种自定义类型&#xff0c;这种类型定义的变量也包含一系列类型&#xff0c;特征是这些类型公用一块内存空间(所以叫联合体也叫公用体)可以理解为结构体公用一块内存。 //联合-联合体-共用体 //联合也是一种特殊的自…

Other -- ChatGPT 原理

本文为个人理解&#xff0c;帮助小白&#xff08;本人就是&#xff09;了解正在创建新时代的 AI 产品&#xff0c;如文中理解有误欢迎留言。 [参考链接--](https://baijiahao.baidu.com/s?id1765556782543603120&wfrspider&forpc) 1. 了解一些基本概念 大语言模型&a…

MySQL进阶学习--day02

存储引擎介绍 1. InnoDB1.1 介绍1.2 特点1.3 文件1.4 逻辑存储结构 2. MyISAM2.1 介绍2.2 特点2.3 文件 3. Memory3.1 介绍3.2 特点3.3 文件 4. 区别及特点5. 存储引擎选择6. InnoDB引擎与MyISAM引擎的区别 ? 上篇文章我们介绍了什么是存储引擎&#xff0c;以及如何在建表时如…

来自OpenAI的官方解释:ChatGPT中的GPTs与Assistants API的区别是什么?有什么差异?

本文原文来自DataLearnerAI的官方网站&#xff1a; 来自OpenAI的官方解释&#xff1a;ChatGPT中的GPTs与Assistants API的区别是什么&#xff1f;有什么差异&#xff1f; | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051701996595465 OpenAI发布的产…

玩转大数据11:数据可视化与交互式分析

1. 引言 数据可视化和交互式分析是大数据领域中的重要方面。随着大数据时代的到来&#xff0c;数据量越来越大&#xff0c;数据类型越来越复杂&#xff0c;传统的数据处理和分析方法已经无法满足我们的需求。数据可视化可以将复杂的数据以简单、直观的方式呈现出来&#xff0c…

建筑学VR虚拟仿真情景实训教学

首先&#xff0c;建筑学VR虚拟仿真情景实训教学为建筑学专业的学生提供了一个身临其境的学习环境。通过使用VR仿真技术&#xff0c;学生可以在虚拟环境中观察和理解建筑结构、材料、设计以及施工等方面的知识。这种教学方法不仅能帮助学生更直观地理解复杂的建筑理论&#xff0…

DM8/达梦 数据库管理员使用手册详解

1.1DM客户端存放位置 Windows&#xff1a;DM数据库安装目录中tool文件夹和bin文件夹中。 Linux&#xff1a;DM数据库安装目录中tool目录和bin目录中。 1.2DM数据库配置助手 1.2.1Windows创建数据库 打开数据库配置助手dbca 点击创建数据库实例 选择一般用途 浏览选择数据库…

关于振动试验

这是试验的说明&#xff08;来自gbt4710-2009&#xff09; 这是试验的参数&#xff1a; 一、试验方向&#xff1a; 振动试验中有几个方向 除有关规范另有规定外&#xff0c;应在产品的三个互相垂直方向上进行振动试验。 一般定义产品长边为X轴向&#xff0c;短边为Y轴向&…
最新文章