C++类型判断

一、编译期类型判断(静态类型检查)

这类判断在编译阶段完成,零运行时开销,主要用于模板编程、类型萃取等场景。

1.typeid运算符(基础)

typeid可以获取类型信息,返回std::type_info对象,常用于判断两个类型是否相同。

代码示例

cpp

运行

#include <iostream> #include <typeinfo> // 必须包含此头文件 class Base {}; class Derived : public Base {}; int main() { // 1. 判断基本类型 int a = 10; double b = 3.14; std::cout << "type of a: " << typeid(a).name() << std::endl; // 输出:int(不同编译器可能简写,如i) std::cout << "type of b: " << typeid(b).name() << std::endl; // 输出:double(如d) // 2. 判断自定义类型 Base base; Derived derived; std::cout << "base type: " << typeid(base).name() << std::endl; // Base std::cout << "derived type: " << typeid(derived).name() << std::endl; // Derived // 3. 判断类型是否相同 if (typeid(a) == typeid(int)) { std::cout << "a is int type" << std::endl; } // 注意:非多态类型,指针/引用不会触发动态类型判断 Base& ref = derived; std::cout << "ref type: " << typeid(ref).name() << std::endl; // 输出Base(非多态) return 0; }

关键说明

  • typeid返回的name()结果是编译器相关的(比如 GCC 会简写类型名),不能直接依赖字符串内容判断类型。
  • 对于非多态类型(类中无虚函数),typeid仅判断编译期类型,不会解析实际指向的对象类型。
2. 模板类型萃取(C++11 及以上)

通过标准库的std::is_samestd::is_pointerstd::is_class等模板,在编译期精准判断类型属性。

代码示例

cpp

运行

#include <iostream> #include <type_traits> // 必须包含此头文件 template <typename T> void check_type(T value) { // 判断是否为指定类型 if constexpr (std::is_same_v<T, int>) { // C++17的is_same_v,等价于std::is_same<T, int>::value std::cout << "Type is int" << std::endl; } else if constexpr (std::is_same_v<T, double>) { std::cout << "Type is double" << std::endl; } // 判断类型属性 std::cout << "Is pointer: " << std::boolalpha << std::is_pointer_v<T> << std::endl; std::cout << "Is floating point: " << std::is_floating_point_v<T> << std::endl; std::cout << "Is arithmetic: " << std::is_arithmetic_v<T> << std::endl; // 算术类型(int/float等) } int main() { check_type(10); // int,非指针,非浮点,算术类型 check_type(3.14); // double,非指针,浮点,算术类型 check_type(&10); // int*,指针,非浮点,非算术类型 // 自定义类型判断 class MyClass {}; std::cout << "Is class: " << std::is_class_v<MyClass> << std::endl; // true return 0; }

关键说明

  • std::is_same<T, U>:判断 T 和 U 是否是完全相同的类型(包括 const/volatile 修饰)。
  • if constexpr(C++17):编译期条件判断,不会为不满足的分支生成代码,避免运行时开销。
  • 常用类型萃取模板:std::is_pointer(指针)、std::is_reference(引用)、std::is_const(常量)、std::is_base_of(基类判断)。

二、运行期类型判断(动态类型检查)

适用于多态类(含虚函数),在运行时判断对象的实际类型,核心是dynamic_cast

1.dynamic_cast类型转换(核心)

dynamic_cast用于多态类型的向下转换(子类→基类)或交叉转换,转换失败时:

  • 指针类型:返回nullptr
  • 引用类型:抛出std::bad_cast异常。

代码示例

cpp

运行

#include <iostream> #include <typeinfo> #include <exception> // 多态基类(必须有虚函数) class Base { public: virtual ~Base() = default; // 虚析构函数,使类成为多态 }; class Derived1 : public Base {}; class Derived2 : public Base {}; void check_dynamic_type(Base* ptr) { // 判断是否为Derived1类型 if (Derived1* d1_ptr = dynamic_cast<Derived1*>(ptr)) { std::cout << "Object is Derived1 type" << std::endl; } // 判断是否为Derived2类型 else if (Derived2* d2_ptr = dynamic_cast<Derived2*>(ptr)) { std::cout << "Object is Derived2 type" << std::endl; } else { std::cout << "Unknown type" << std::endl; } } int main() { Base* b1 = new Derived1(); Base* b2 = new Derived2(); Base* b3 = new Base(); check_dynamic_type(b1); // Derived1 check_dynamic_type(b2); // Derived2 check_dynamic_type(b3); // Unknown type // 引用类型的dynamic_cast(失败抛异常) try { Base& ref = *b2; Derived1& d1_ref = dynamic_cast<Derived1&>(ref); } catch (const std::bad_cast& e) { std::cout << "Cast failed: " << e.what() << std::endl; } delete b1; delete b2; delete b3; return 0; }

关键说明

  • dynamic_cast仅对多态类(含虚函数)有效,否则编译报错。
  • 运行时开销:dynamic_cast会查询类型信息表(vtable),有轻微运行时开销,应避免频繁使用。
2. 结合typeid实现动态类型判断

对于多态类,typeid会解析对象的实际类型(而非编译期类型):

cpp

运行

#include <iostream> #include <typeinfo> class Base { virtual ~Base() = default; }; class Derived : public Base {}; int main() { Base* ptr = new Derived(); std::cout << typeid(*ptr).name() << std::endl; // Derived(实际类型) delete ptr; return 0; }

三、常见使用场景

  1. 模板编程:用std::is_same/std::is_pointer等编译期判断,实现类型分支逻辑。
  2. 多态场景:用dynamic_cast判断基类指针 / 引用实际指向的子类类型。
  3. 类型安全检查:避免错误的类型转换(如将非多态类强制转换)。

总结

  1. 编译期判断:用std::is_same/std::is_pointer等模板(<type_traits>),零运行时开销,适合模板编程。
  2. 运行期判断:仅适用于多态类,用dynamic_cast(推荐)或typeid,有轻微运行时开销。
  3. 核心注意dynamic_cast依赖虚函数表,仅对多态类有效;typeid对非多态类仅返回编译期类型。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 内置 venv 虚拟环境工具完全指南(附 uv 工具无缝升级教程)

Python venv 虚拟环境基础操作创建虚拟环境命令格式如下&#xff0c;需指定目标目录路径&#xff1a;python -m venv /path/to/your/env激活虚拟环境的脚本路径因操作系统而异&#xff1a;Windows: \path\to\env\Scripts\activateUnix/macOS: source /path/to/env/bin/activate…

2026机器视觉同轴光源品牌甄选指南:解锁高精度检测的照明密钥

在智能制造与工业自动化飞速发展的今天&#xff0c;机器视觉系统已成为现代工业的“智慧之眼”。而同轴光源作为这一“眼睛”的核心照明系统&#xff0c;其性能直接决定了视觉检测的精度与可靠性。面对2026年工业检测对精度、效率和稳定性提出的更高要求&#xff0c;选择一款真…

如何使用`typeid`判断指针或引用所指对象的实际类型?

核心前提&#xff1a;typeid判断实际类型的条件typeid能否识别指针 / 引用指向的实际类型&#xff0c;唯一的关键是&#xff1a;被判断的类是否是多态类&#xff08;包含至少一个虚函数&#xff0c;通常是虚析构函数&#xff09;。非多态类&#xff1a;typeid只能识别编译期的声…

C++ RAII封装结构体成员变量自动加锁性能开销分析

在C中通过RAII&#xff08;Resource Acquisition Is Initialization&#xff09;机制封装结构体成员变量的自动加锁/解锁操作&#xff0c;其性能开销需从锁机制成本、编译器优化空间、运行时场景适配三个维度进行系统性分析&#xff1a; 一、RAII加锁封装的核心机制 以典型实现…

凤希AI提出FXPA2P:下一代点对点AI服务架构-2026年1月14日

思考与发现在今日对产品技术细节进行打磨与升级的同时&#xff0c;一个更为宏观和前瞻性的构想逐渐清晰。基于对当前AI应用依赖中心化云服务所暴露的成本、效率与隐私问题的深刻洞察&#xff0c;我们正式提出 FXPA2P 这一商业概念与技术实施模式。FXPA2P&#xff0c;即 FengXi …

智能指针的生命周期控制

在C中&#xff0c;函数内创建的智能指针通过参数返回时&#xff0c;其生命周期管理遵循资源所有权转移和引用计数的智能指针语义&#xff0c;具体行为取决于智能指针类型&#xff08;如std::unique_ptr、std::shared_ptr&#xff09;和传递方式&#xff08;返回值/输出参数&…

AI原生应用开发:相似度匹配的模型压缩技巧

AI原生应用开发:相似度匹配的模型压缩技巧 关键词:相似度匹配、模型压缩、AI原生应用、知识蒸馏、模型量化、参数剪枝、轻量级模型 摘要:在AI原生应用(如智能推荐、跨模态搜索、对话系统语义理解)中,相似度匹配模型是核心组件。但这类模型常因参数量大、计算复杂度高,难…

6款AI论文降重神器实操教程:AI率从72%降至13%

一、AI论文降重工具快速对比&#xff1a;哪款最适合你&#xff1f; 作为学生或科研人员&#xff0c;你是否曾遇到以下痛点&#xff1a; 用ChatGPT写的论文AI检测率高达70%&#xff0c;被导师打回重写&#xff1f;降重时逐句改写&#xff0c;耗时又容易破坏逻辑&#xff1f;找…

Python + uiautomator2 手机自动化控制教程

安装 uiautomator2 库通过 pip 安装 uiautomator2 库&#xff0c;确保 Python 环境已配置。pip install uiautomator2初始化设备连接使用设备的 IP 地址或序列号连接手机&#xff0c;确保手机已开启 USB 调试模式。import uiautomator2 as u2 d u2.connect("192.168.1.10…

Python 学生管理系统实战:从基础功能到数据持久化(附完整源码)

学生管理系统基础功能实现学生管理系统的核心功能包括添加、删除、修改和查询学生信息。使用Python内置数据结构如字典和列表可以快速实现这些基础功能。students []def add_student():name input("输入学生姓名: ")age int(input("输入学生年龄: "))st…

【Python库和代码案例:第一课】Python 标准库与第三方库实战指南:从日期处理到 Excel 操作

Python 标准库实战datetime 模块处理日期from datetime import datetime, timedelta# 获取当前时间 now datetime.now() print(f"当前时间: {now}")# 时间加减操作 next_week now timedelta(days7) print(f"一周后时间: {next_week}")# 时间格式化 form…

数独优化求解C库tdoku-lib的使用

tdoku-lib是基于优化求解器tdoku改造的动态库和静态库&#xff0c;它的存储库地址 https://github.com/hackerzhuli/tdoku-lib 1.拉取源代码 rootDESKTOP-59T6U68:/mnt/c/d# git clone https://github.com/hackerzhuli/tdoku-lib.gitCloning into tdoku-lib... remote: Enumer…

AI原生应用云端推理的故障排查与恢复

AI原生应用云端推理的故障排查与恢复:让智能服务“不掉线”的秘密 关键词:AI原生应用、云端推理、故障排查、恢复机制、AIOps 摘要:当你用手机拍照识别植物品种时,当智能客服秒级回复你的问题时,当电商APP精准推荐商品时——这些“丝滑”体验的背后,是AI原生应用在云端高…

dlx求解数独duckdb插件的编写和使用

1.将网上下载的dlx求解c程序添加int sudoku(const char *s,char *r)函数处理81个字符长的数独题目字符串 #include <cstdio> #include <cstring> #include <ctime> int cnt0; const int XSIZE 3; const int SIZE XSIZE * XSIZE; const int MAX_C SIZE *…

我用 XinServer 做了个文件系统,比想象简单

我用 XinServer 做了个文件系统&#xff0c;比想象简单 最近有个朋友找我帮忙&#xff0c;说他们团队想做个内部文件管理系统&#xff0c;让不同部门的同事能上传、下载、共享文档&#xff0c;还要有权限控制。他问我&#xff1a;“这个后端大概要搞多久&#xff1f;我们前端倒…

大数据领域数据产品的安全保障策略

大数据领域数据产品的安全保障策略&#xff1a;从全生命周期到体系化防御 引言&#xff1a;当大数据产品遇到安全“灰犀牛” 清晨打开手机&#xff0c;你收到一条推送&#xff1a;“某电商平台2000万用户信息泄露&#xff0c;含手机号、地址、购物记录”&#xff1b;下午参加…

避坑指南:通义千问2.5-7B-Instruct本地部署常见问题解决

避坑指南&#xff1a;通义千问2.5-7B-Instruct本地部署常见问题解决 1. 引言 1.1 业务场景描述 随着大模型在企业级应用和开发者项目中的普及&#xff0c;越来越多团队选择将高性能、可商用的开源模型部署至本地环境&#xff0c;以实现数据隐私保护、低延迟响应和定制化功能…

【RuoYi-SpringBoot3-Pro】:使用 Dify + AI 快速生成多数据库建表语句

【RuoYi-SpringBoot3-Pro】&#xff1a;使用 Dify AI 快速生成多数据库建表语句告别手写 SQL&#xff0c;一句话生成标准化建表语句&#xff0c;支持 MySQL、PostgreSQL、openGauss、SQLite 多种数据库&#xff0c;再也不用为给字段起名字发愁了。GitHub:https://github.com/u…

AnimeGANv2版本回滚机制:模型更新失败应急部署教程

AnimeGANv2版本回滚机制&#xff1a;模型更新失败应急部署教程 1. 引言 1.1 业务场景描述 在AI图像风格迁移应用中&#xff0c;AnimeGANv2 因其轻量高效、画风唯美的特性&#xff0c;广泛应用于二次元头像生成、社交内容创作等场景。随着模型迭代加速&#xff0c;开发者常通…

这份无线联网智能门锁系统清单非常专业,清晰地勾勒出了一套适用于多业态、高流动性、强管理场景的现代化出入口解决方案。这不仅是设备清单,更是一套“去中心化部署、云端化管理”的智慧运营蓝图。

无线联网智能门锁系统——专为公寓、办公、宿舍、民宿与酒店打造的全场景智能门禁解决方案这套无线联网智能门锁系统&#xff0c;专为高流动性、多权限管理的场景设计&#xff0c;已广泛应用于公寓、企业宿舍、办公场所、民宿及酒店等环境&#xff0c;实现“一卡通行、远程管控…