0

0

c++的std::type_index和typeid有什么关系? (运行时类型识别)

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-13 00:53:33

|

363人浏览过

|

来源于php中文网

原创

std::type_index是typeid返回值的可拷贝、可哈希包装器,仅支持以typeid(...)显式构造,不提供默认或裸指针构造,其比较与哈希依赖底层type_info实现。

c++的std::type_index和typeid有什么关系? (运行时类型识别)

std::type_index 是 typeid 返回值的包装器

typeid 表达式在运行时返回一个 const std::type_info&,它不可拷贝、不可赋值,也不能直接用作容器键或 unordered 容器的哈希目标。std::type_index 就是为解决这个问题而设计的:它内部持有一个 const std::type_info*,并提供了拷贝、比较、哈希等操作符重载。

必须用 typeid(...) 构造 std::type_index,不能直接 new 或默认构造

std::type_index 没有默认构造函数,也不接受裸指针构造。它只接受 typeid 表达式作为参数:

std::type_index ti1 = typeid(int);
std::type_index ti2 = typeid(std::string);
// ✅ 正确:传入 typeid 结果

std::type_index ti3(typeid(double)); // 也合法,显式构造 // ❌ 错误:std::type_index ti; // 编译失败 // ❌ 错误:std::type_index ti(*some_type_info_ptr); // 没有该构造函数

比较和哈希行为完全依赖 underlying type_info 的实现

std::type_index==std::hash<:type_index> 都转发给其内部持有的 type_info 对象。这意味着:

  • 两个 std::type_index 相等 ⇔ 它们封装的 type_info 指向同一类型(包括 cv 限定和引用修饰)
  • std::type_index 可安全用作 std::mapstd::unordered_map 的 key
  • 但注意:typeid(int)typeid(const int) 是不同 type_info,因此 std::type_index 也不同
  • 某些编译器(如 GCC)对模板实例化类型可能生成多个 type_info 地址(尤其跨 DSO 边界),此时 == 可能失效 —— 这不是 std::type_index 的问题,而是 typeid 本身的 ABI 限制

实际用途:替代裸 type_info 做类型注册与分发

最常见的使用场景是构建运行时类型映射表,比如插件系统或序列化框架中按类型查找处理函数:

Removal.AI
Removal.AI

AI移出图片背景工具

下载

立即学习C++免费学习笔记(深入)”;

std::unordered_map> handlers;
handlers[typeid(int)] = [](void* p) { std::cout << *static_cast(p) << '\n'; };
handlers[typeid(std::string)] = [](void* p) { std::cout << *static_cast(p) << '\n'; };

// 后续可安全调用: void dispatch(const std::type_info& ti, void* ptr) { auto it = handlers.find(std::type_index(ti)); if (it != handlers.end()) it->second(ptr); }

这里必须用 std::type_index 才能放进 std::unordered_map;若直接存 const std::type_info&,不仅无法哈希,生命周期也难以管理。

真正容易被忽略的是:哪怕你只在单个 .cpp 文件里用 typeid,只要涉及跨编译单元取地址(比如把 &typeid(T) 存进全局 map),就可能撞上 ABI 不一致问题 —— 此时 std::type_index 不会帮你绕过,它只是让 type_info 更好用,而不是更可靠。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

523

2023.09.20

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

37

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

37

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.7万人学习

C 教程
C 教程

共75课时 | 4万人学习

C++教程
C++教程

共115课时 | 12.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号