C++标准模板(STL)- 类型支持 (运行时类型识别,type_info )

运行时类型识别

定义于头文件 <typeinfo>

含有某个类型的信息,由实现生成。​​这是 typeid 运算符所返回的类。

std::type_info

定义于头文件 <typeinfo>

class type_info;

 类 type_info 保有一个类型的实现指定信息,包括类型的名称和比较二个类型相等的方法或相对顺序。这是 typeid 运算符所返回的类。

type_info 既非可复制构造 (CopyConstructible) 亦非可复制赋值 (CopyAssignable) 。

成员函数

(构造函数)

[被删除]

无默认或复制构造函数
(公开成员函数)

(析构函数)

[虚]

通过指向基类的指针删除导出对象是安全的
(虚公开成员函数)

operator=

[被删除]

不能复制赋值
(公开成员函数)

operator==operator!=

(C++20 中移除)

检查对象是否指代相同类型
(公开成员函数)

before

检查在实现定义的顺序中,被指代类型是否在另一个 type_info 对象之前,即对被指代类型排序
(公开成员函数)

hash_code

(C++11)

返回对于同一类型相同的值
(公开成员函数)

name

类型的实现定义名称
(公开成员函数)

 析构函数

std::type_info::~type_info

virtual ~type_info();

析构 std::type_info 类型的对象。此析构函数为公开虚函数,允许通过指向基类的指针安全地删除从 std::type_info 导出的类的对象。

检查对象是否指代相同类型

std::type_info::operator==, 
std::type_info::operator!=

bool operator==( const type_info& rhs ) const;

(C++11 前)

bool operator==( const type_info& rhs ) const noexcept;

(C++11 起)

bool operator!=( const type_info& rhs ) const;

(C++11 前)

bool operator!=( const type_info& rhs ) const noexcept;

(C++11 起)
(C++20 前)

 

检查对象是否指代相同类型。

参数
rhs-要比较的另一个类型信息对象
返回值

若比较关系成立则为 true ,否则为 false

调用示例
#include <iostream>
#include <typeinfo>
#include <string>
#include <utility>class person
{
public:person(std::string&& n) : _name(n) {}virtual const std::string& name() const{return _name;}private:std::string _name;
};class employee : public person
{
public:employee(std::string&& n, std::string&& p) :person(std::move(n)), _profession(std::move(p)) {}const std::string& profession() const{return _profession;}private:std::string _profession;
};void somefunc(const person& p)
{if (typeid(employee) == typeid(p)){std::cout << p.name() << " is an employee ";auto& emp = dynamic_cast<const employee&>(p);std::cout << "who works in " << emp.profession() << std::endl;}
}int main()
{employee paul("Paul", "Economics");somefunc(paul);return 0;
}
输出

检查在实现定义的顺序中,被指代类型是否在另一个 type_info 对象之前,即对被指代类型排序

std::type_info::before

bool before( const type_info& rhs ) const;

(C++11 前)

bool before( const type_info& rhs ) const noexcept;

(C++11 起)

若此 type_info 的类型在实现的对照顺序中列于 rhs 的类型之前则返回 true 。不给出保证,特别是对照顺序可以在同一程序的调用之间改变。

参数
rhs-要比较的另一个类型信息对象
返回值

若此 type_info 的类型在实现的对照顺序中列于 rhs 的类型之前则为 true 。

 调用示例
#include <iostream>
#include <typeinfo>int main()
{if (typeid(int).before(typeid(char))){std::cout << "int goes before char in this implementation.\n";}else{std::cout << "char goes before int in this implementation.\n";}return 0;
}
输出

返回对于同一类型相同的值

std::type_info::hash_code

std::size_t hash_code() const noexcept;

(C++11 起)

返回未指定值,使得指代同一类型的所有 type_info 对象的 hash_code() 相同。

不给出其他保证:指代不同类型的 type_info 对象可以拥有相同的 hash_code (尽管标准推荐实现尽可能避免这点),而同一类型的 hash_code 可在相同程序的各次不同调用间改变。

参数

(无)

返回值

对所有指代同一类型的 type_info 对象等同的值。

调用示例
#include <iostream>
#include <typeinfo>
#include <unordered_map>
#include <string>
#include <functional>
#include <memory>struct A
{virtual ~A() {}
};struct B : A {};
struct C : A {};using TypeInfoRef = std::reference_wrapper<const std::type_info>;struct Hasher
{std::size_t operator()(TypeInfoRef code) const{return code.get().hash_code();}
};struct EqualTo
{bool operator()(TypeInfoRef lhs, TypeInfoRef rhs) const{return lhs.get() == rhs.get();}
};int main()
{std::unordered_map<TypeInfoRef, std::string, Hasher, EqualTo> type_names;type_names[typeid(int)] = "int";type_names[typeid(double)] = "double";type_names[typeid(A)] = "A";type_names[typeid(B)] = "B";type_names[typeid(C)] = "C";int i;double d;A a;// 注意我们存储指向 A 的指针std::unique_ptr<A> b(new B);std::unique_ptr<A> c(new C);std::cout << "i is " << type_names[typeid(i)] << std::endl;std::cout << "d is " << type_names[typeid(d)] << std::endl;std::cout << "a is " << type_names[typeid(a)] << std::endl;std::cout << "b is " << type_names[typeid(*b)] << std::endl;std::cout << "c is " << type_names[typeid(*c)] << std::endl;return 0;
}
 输出

类型的实现定义名称

std::type_info::name

const char* name() const;

(C++11 前)

const char* name() const noexcept;

(C++11 起)

返回实现定义的,含有类型名称的空终止字符串。不给出保证,尤其是返回的字符串对于数个类型可以相同,而且在同一程序的调用之间改变。

参数

(无)

返回值

含有类型名称的空终止字符串。

注意

返回指针所指向的数组的生存期未指定,但实践中只要给定类型的 RTTI 数据结构存在,它就得到保持,这拥有应用程序生存期,除非从动态库加载它(可被卸载)。

一些实现(如 MSVC 、 IBM 、 Oracle )生成人类可读的类型名。其他的,最值得注意的是 gcc 与 clang ,返回重整名,这是由 Itanium C++ ABI 指定的。重整名可以用实现指定的 API 转换到人类可读的形式,例如直接用 abi::__cxa_demangle 或通过 boost::core::demangle 。它亦可通过命令行工具 c++filt -t 输送往管道。

 调用示例
#include <iostream>
#include <typeinfo>struct Base
{virtual ~Base() = default;
};
struct Derived : Base {};int main()
{Base b1;Derived d1;const Base *pb = &b1;std::cout << typeid(*pb).name() << std::endl;pb = &d1;std::cout << typeid(*pb).name() << std::endl;return 0;
}
输出

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

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

相关文章

【论文解读】Parameter-Efficient Transfer Learning for NLP

一. 介绍 1.1 为什么要引入Adapter 在存在许多下游任务的情况下&#xff0c;微调的参数效率很低:每个任务都需要一个全新的模型。作为替代方案&#xff0c;我们建议使用适配器模块进行传输。 1.2 论文目标 目标是建立一个在所有这些方面都表现良好的系统&#xff0c;但不需…

docker图形胡界面管理工具--Portainer可视化面板安装

1.安装运行Portainer docker run -d -p 8088:9000 \ > --restartalways -v /var/run/docker.sock:/var/run/docker.sock --privilegedtrue portainer/portainer--restartalways&#xff1a;Docker启动后容器自动启动 -p&#xff1a;端口映射 -v&#xff1a;路径映射2.通过…

写一个简单的解释器(2) 构建标记流

确定标记类型 分为几个大类&#xff1a; 用户符号&#xff08;类型/标识符/数字/字符串…)关键字 (流程控制和定义符)括号 &#xff08;这里暂时认为 [] 属于括号&#xff09;分号 上述四类标记基本囊括了 vc \texttt{vc} vc 中的所有最小单元的类型&#xff0c;但是因为构…

【C++】哈希应用——海量数据面试题

哈希应用——海量数据面试题 一、位图应用1、给定100亿个整数&#xff0c;设计算法找到只出现一次的整数&#xff1f;2、给两个文件&#xff0c;分别有100亿个整数&#xff0c;我们只有1G内存&#xff0c;如何找到两个文件交集&#xff1f;&#xff08;1&#xff09;用一个位图…

JAVA基础(JAVA SE)学习笔记(七)面向对象编程(进阶)

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第二阶段&#xff1a;Java面向对象编程 6.面向对象编程&#xff08;基础&#xff09; 7.面向对象编程&…

Ubuntu下 u2net tensorrt模型部署

TensorRT系列之 Windows10下yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov7 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov6 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov5 tensorrt模型加速…

nginx部署vue项目(访问路径加前缀)

nginx部署vue项目(访问路径加前缀) nginx部署vue项目&#xff0c;访问路径加前缀分为两部分&#xff1a; &#xff08;1&#xff09;修改vue项目&#xff1b; &#xff08;2&#xff09;修改nginx配置&#xff1b; vue项目修改 需注意&#xff0c;我这是vue-cli3配置&#x…

某验四代滑块验证码逆向分析

逆向目标 目标&#xff1a;某验四代滑块验证码&#xff0c;w 参数逆向主页&#xff1a;aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v加密算法&#xff1a;RSA、AES 通讯流程 验证码流程分析 进入网页后&#xff0c;打开开发者人员工具进行抓包&#xff0c;点击滑动拼图验证&#xff0c…

Vue3语法-双向绑定

点击加入精英计划可以加入 点击名字可以删除 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!-- vue.js --><script src"https://unpkg.com/vue3/dist/vue.glob…

微软正式发布开源应用平台 Radius平台

“ 10 月 18 日&#xff0c;微软 Azure 孵化团队正式发布开源应用平台 Radius&#xff0c;该平台将应用程序置于每个开发阶段的中心&#xff0c;重新定义应用程序的构建、管理与理解方式。” 简单的概括就是&#xff0c;它和Kubernetes不一样&#xff0c;Radius将应用程序放在每…

在Windows下Edge浏览器OA发起流程问题

在Edge浏览器中发起流程 如上图所示&#xff0c;不能正常打开Excel&#xff0c;自动将Excel表格转为了PDF 怎么处理&#xff1f;还得使用IE浏览器来访问&#xff0c;但打开IE后又自动跳转到Edge&#xff0c;根本就不给使用&#xff0c;在Edge下使用IE模式也解决不了这个问题。…

项目管理实战总结(二)-沟通路径

在一个大型的项目管理中&#xff0c;不同的沟通路径&#xff0c;会对整个事情的进展形成不同的影响。从项目管理的视角来看&#xff0c;该如何驱动项目有效进展&#xff0c;失之毫厘谬以千里。 沟通路径&#xff1a;调查问卷的推动事宜 在项目进行到了后期&#xff0c;甲方希…

python学习笔记7-图的建立常用技巧

题目链接 题目中给了邻接链表&#xff0c;转为邻接矩阵初始化邻接矩阵 graph [[] for _ in range(n)]dfs() 的写法&#xff0c; 用visi避免重复访问&#xff0c;得到每个点所在的联通分量中点的个数 class Solution:def countPairs(self, n: int, edges: List[List[int]]) -…

JVM的几个面试重点

JVM的内存区域划分 JVM类加载机制 前言 Java程序最开始是一个 .java 的文件&#xff0c;JVM把它编译成 .closs 文件&#xff08;字节码文件&#xff09;&#xff0c;运行 Java 程序&#xff0c; JVM 就会读取 .class 文件&#xff0c;把文件内容读取到内存中&#xff0c;构造出…

YOLOv5:修改backbone为SPD-Conv

YOLOv5&#xff1a;修改backbone为SPD-Conv 前言前提条件相关介绍SPD-ConvYOLOv5修改backbone为SPD-Conv修改common.py修改yolo.py修改yolov5.yaml配置 参考 前言 记录在YOLOv5修改backbone操作&#xff0c;方便自己查阅。由于本人水平有限&#xff0c;难免出现错漏&#xff0c…

HammerDB的安装和使用(超详细)

目录 ​编辑 一、HammerDB的介绍 二、HammerDB的安装 1、下载hammerdb安装包 2、权限配置以及安装 3、查看安装目录 三、安装前的配置 1、启动监听 2、启动数据库 3、创建表空间 1.修改临时表空间 2…

【源码解析】Spring源码解读-bean的加载

Spring的整体流程其实就是通过配置 xml、注解将自定义bean类信息进行配置&#xff0c;然后通过BeanDefinitionReader读取配置信息&#xff0c;由Dom转换成xml解析成Docment。在通过加载的配置信息进行初始化Bean对象&#xff0c;然后在对象的前后进行处理&#xff0c;也就是不同…

Elesticsearch使用总结

写在前面 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是当前流行的企业级搜索引擎。设计用于[云计…

vue3 更换 elemnt-ui / element-plus 版本npm命令

1. 安装 / 更换 element-ui 版本 [ 在 后面指定想要安装的版本 ] //卸载当前版本 npm uninstall element-ui //安装指定版本 npm i element-ui2.4.8 -S --legacy-peer-deps 2. 安装 / 更换 element-plus 版本 [ 在 后面指定想要安装的版本 ] npm install element-plus2.3…

面向对象【构造器】

文章目录 构造器定义构造器的作用构造器的使用说明无参构造器带参数的构造器构造器的重载使用构造器创建对象 总结 构造器定义 构造器是一种特殊类型的方法&#xff0c;它与类同名&#xff0c;没有返回值&#xff0c;并且用于在创建对象时执行初始化操作。构造器的名称必须与类…