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.pswp.cn/news/210842.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210842.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210842.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于振動試驗

這是試驗的說明&#xff08;來自gbt4710-2009&#xff09; 這是試驗的參數&#xff1a; 一、試驗方向&#xff1a; 振動試驗中有幾個方向 除有關規范另有規定外&#xff0c;應在產品的三個互相垂直方向上進行振動試驗。 一般定義產品長邊為X軸向&#xff0c;短邊為Y軸向&…

飛書面試題匯總

面試相關經驗 Interview | JavaGuide(Java面試 學習指南) 同學1 7次面試 編程題匯總&#xff1a; 有序鏈表找中位數 &#xff08;飛書1面&#xff09; m個有序數組合并 &#xff08;飛書1面&#xff09; 海量數據尋找TopK&#xff08;口述&#xff09; &#xff08;飛書…

Android 10(Q) 以上普通 APP 隱藏應用圖標問題探究及解決方案

1、實驗環境 aosp 版本 10.0 系統 aosp 版本 13.0 系統 2、驗證結果 2.1 方式一 APP AndroidManifest.xml 中通過 activity-alias 配置帶 LAUNCHER 屬性 category&#xff0c;并且 android:enabled“true” 10.0 系統中可安裝后正常顯示 icon&#xff0c;通過 setComponen…

idea中run和debug是灰色的

【現象】idea中run和debug是灰色的 點擊 旁邊的Add Configuration…一看都是空白 【解決方法】&#xff1a; npm點開之后 【結果】

文本轉圖像 學習筆記

VQGAN (Vector Quantized Generative Adversarial Network) 是一種基于 GAN 的生成模型&#xff0c;可以將圖像或文本轉換為高質量的圖像。 VQ &#xff08;Vector Quantization&#xff09;是一種數據壓縮技術&#xff0c;是指將連續數據表示為離散化的向量。輸入的圖像或文本…

轉換NC或HDF數據時候轉出數據無坐標信息的處理方法

有時候我們在轉換NC或HDF數據時&#xff0c;有時候會出現沒有坐標信息的情況&#xff01;如下圖&#xff1a; 這種情況一般是原始數據將坐標信息存儲在說明文件中以便后期做生成坐標信息的處理、或坐標存儲的形式比較特殊&#xff0c;造成工具無法讀取&#xff01;這種數據處理…

Python迭代器與生成器研究記錄

Python迭代器與生成器研究記錄 前言 迭代器肯定是可迭代對象&#xff0c;但是可迭代對象不一定是迭代器&#xff0c;生成器一定是迭代器&#xff0c;但是迭代器不一定是生成器 生成器是特殊的迭代器&#xff0c;所以生成器一定是迭代器&#xff0c;迭代器一定是可迭代對象 我…

YOLOv8分割訓練及分割半自動標注

YOLOv8是基于目標檢測算法YOLOv5的改進版,它在YOLOv5的基礎上進行了優化和改進,加入了一些新的特性和技術,如切片注意力機制、骨干網絡的選擇等。 本文以yolov8-seg為基準,主要整理分割訓練流程及使用v8分割模型進行半自動標注的過程。 一、v8-seg訓練 1.1 環境配置 github…

【Altera】平臺設計器互連會回壓 AXI 接口怎么辦

說明 實現 AXI 接口的所有組件都具有發行或接受能力設置。每當互連檢測到管理器&#xff08;主管理器&#xff09;發出的事務多于管理器的發行容量設置時&#xff0c;互連將通過斷言 AxREADY 向管理器背壓。每當互連檢測到從屬&#xff08;從站&#xff09;接收的事務多于從屬的…

實用篇 | 一文快速構建人工智能前端展示streamlit應用

----------------------- &#x1f388;API 相關直達 &#x1f388;-------------------------- &#x1f680;Gradio: 實用篇 | 關于Gradio快速構建人工智能模型實現界面&#xff0c;你想知道的都在這里-CSDN博客 &#x1f680;Streamlit :實用篇 | 一文快速構建人工智能前端展…

Activity從下往上彈出視差效果實現

其實這篇文章是轉至簡書上的大佬的&#xff0c;加上我自己的代碼實踐了下發現可行&#xff0c;于是就分享下 先看效果 介紹: 其實有很多方法都可以實現這種效果&#xff0c;popwindow&#xff0c;Dialog&#xff0c;BottomSheetDialogFragment&#xff0c;BottomSheetDialog等…

Linux 安裝 Gitea.md

### 從官網下載git 和 gitea Git下載地址: https://mirrors.edge.kernel.org/pub/software/scm/git/ 下載 git-2.43.0.tar.gz: https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.43.0.tar.gz Gitea下載地址: https://dl.gitea.com/gitea/ 下載 linux-arm64 的二進…

鏈表OJ—相交鏈表

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言 1、相交鏈表的題目&#xff1a; 方法講解&#xff1a; 圖文解析&#xff1a; 代碼實現&#xff1a; 總結 前言 世上有兩種耀眼的光芒&#xff0c;一種是正在升…

15.Java程序設計-基于SSM框架的微信小程序校園求職系統的設計與實現

摘要&#xff1a; 本研究旨在設計并實現一款基于SSM框架的微信小程序校園求職系統&#xff0c;以提升校園求職流程的效率和便捷性。通過整合微信小程序平臺和SSM框架的優勢&#xff0c;本系統涵蓋了用戶管理、職位發布與搜索、簡歷管理、消息通知等多個功能模塊&#xff0c;為…

愛智EdgerOS之深入解析AI圖像引擎如何實現AI視覺開發

一、前言 AI 視覺是為了讓計算機利用攝像機來替代人眼對目標進行識別&#xff0c;跟蹤并進一步完成一些更加復雜的圖像處理。這一領域的學術研究已經存在了很長時間&#xff0c;但直到 20 世紀 70 年代后期&#xff0c;當計算機的性能提高到足以處理圖片這樣大規模的數據時&am…

ArkUI組件

目錄 一、概述 聲明式UI 應用模型 二、常用組件 1、Image&#xff1a;圖片展示組件 示例 配置控制授權申請 2、Text&#xff1a;文本顯示組件 示例 3、TextInput&#xff1a;文本輸入組件 示例 4、Button&#xff1a;按鈕組件 5、Slider&#xff1a;滑動條組件 …

Swagger PHP Thinkphp 接口文檔

安裝 1. 安裝依賴 composer require zircote/swagger-php 2. 下載Swagger UI git clone https://github.com/swagger-api/swagger-ui.git 3. 復制下載好的Swagger UI 中的dist目錄到public目錄中&#xff0c;修改目錄名稱 cp -rf swagger-ui/dist /home/htdocs/public/ m…

vue中設置滾動條的樣式

在vue項目中&#xff0c;想要設置如下圖中所示滾動條的樣式&#xff0c;可以采用如下方式&#xff1a; ?// 直接寫在vue.app文件中 ::-webkit-scrollbar {width: 3px;height: 3px; } ::-webkit-scrollbar-thumb { //滑塊部分// border-radius: 5px;background-color: #1890ff;…

【智能家居】智能家居項目

智能家居項目目錄 項目目錄結構 完整而典型的項目目錄結構 CMake模板 CMake編譯運行 README.md 項目說明文檔 智能家居項目目錄 【智能家居】面向對象編程OOP和設計模式(工廠模式) 【智能家居】一、工廠模式實現繼電器燈控制 【智能家居】二、添加火災檢測模塊&#xff08;…