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

news2024/11/16 23:42:42

运行时类型识别

定义于头文件 <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.coloradmin.cn/o/1121497.html

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

相关文章

《机器学习》第6章 支持向量机

文章目录 6.1 间隔与支持向量6.2 对偶问题6.3 核函数支持向量展式核函数 6.4 软间隔与正则化6.5 支持向量回归6.6 核方法6.7 阅读材料 6.1 间隔与支持向量 分类学习最基本的想法就是基于训练集D在样本空间中找到一个划分超平面,将不同类别的样本分开.但能将训练样本分开的划分…

UG\NX二次开发 取消抑制特征 UF_MODL_unsuppress_feature

文章作者:里海 来源网站:《里海NX二次开发3000例专栏》 感谢粉丝订阅 感谢 bullzhanghao 订阅本专栏,非常感谢。 简介 UG\NX二次开发 取消抑制特征 UF_MODL_unsuppress_feature 效果 代码 #include "me.hpp" #include <vector> #

100114. 元素和最小的山形三元组 II

如果下标三元组 (i, j, k) 满足下述全部条件&#xff0c;则认为它是一个 山形三元组 &#xff1a;i < j < k nums[i] < nums[j] 且 nums[k] < nums[j] 请你找出 nums 中 元素和最小 的山形三元组&#xff0c;并返回其 元素和 。如果不存在满足条件的三元组&#xf…

昇腾AscendCL推理应用开发入门教程(基于Python语言)

pyACL&#xff08;Python Ascend Computing Language&#xff09;是一套在AscendCL的基础上使用CPython封装得到的Python API库&#xff0c;使用户可以通过Python进行昇腾AI处理器的运行管理、资源管理等&#xff0c;实现在昇腾CANN平台上进行深度学习推理计算、图形图像预处理…

表结构的操作【MySQL】

文章目录 创建表例子 查看表结构修改表新增列属性修改列属性修改列名修改表名删除列 删除表 阅读前导&#xff1a; 一般来说&#xff0c;对表的操作可以分为对表结构和对表内容的操作。 对表结构的操作&#xff0c;就是用数据定义语言 DDL 来创建、修改或删除表中的对象&#…

elementUI 中 date-picker 的使用的坑(vue3)

目录 1. 英文显示2. format 与 value-format 无效3. date-picker 时间范围4. 小结 1. 英文显示 <el-date-pickerv-model"dateValue"type"date"placeholder"选择日期"></el-date-picker>解决方案&#xff1a; 引用 zhCn <script&g…

web开发初级工程师学习笔记

web开发初级工程师学习笔记 前端开发工具实验1 VS Code 初体验介绍 前端开发工具 实验1 VS Code 初体验 介绍 VS Code 环境提供的是一个可以在浏览器中使用原生 VS Code 编辑代码的程序。在该环境中&#xff0c;你可以使用到与本地安装近乎一致的 VS Code 程序来编辑代码文件…

PAM从入门到精通(十九)

接前一篇文章&#xff1a;PAM从入门到精通&#xff08;十八&#xff09; 本文参考&#xff1a; 《The Linux-PAM Application Developers Guide》 PAM 的应用开发和内部实现源码分析 先再来重温一下PAM系统架构&#xff1a; 更加形象的形式&#xff1a; 六、整体流程示例 2.…

linux安装visual studio code

下载 https://code.visualstudio.com/ 下载.deb文件 安装 假如文件被下载到了 /opt目录下 进入Opt目录&#xff0c;右键从当前目录打开终端。 输入下面的安装命令。 sudo apt-get install ./code_1.83.1-1696982868_amd64.deb 安装成功。 配置 打开 visual studio cod…

博客续更(五)

十一、后台模块-菜单列表 菜单指的是权限菜单&#xff0c;也就是一堆权限字符串 1. 查询菜单 1.1 接口分析 需要展示菜单列表&#xff0c;不需要分页。可以针对菜单名进行模糊查询。也可以针对菜单的状态进行查询。菜单要按照父菜单id和orderNum进行排序 请求方式 请求路径…

Sentinel授权规则和规则持久化

大家好我是苏麟 , 今天说说Sentinel规则持久化. 授权规则 授权规则可以对请求方来源做判断和控制。 授权规则 基本规则 授权规则可以对调用方的来源做控制&#xff0c;有白名单和黑名单两种方式。 白名单&#xff1a;来源&#xff08;origin&#xff09;在白名单内的调用…

Linux下Jenkins自动化部署SpringBoot应用

Linux下Jenkins自动化部署SpringBoot应用 1、 Jenkins介绍 官方网址&#xff1a;https://www.jenkins.io/ 2、安装Jenkins 2.1 centos下命令行安装 访问官方&#xff0c;点击文档&#xff1a; 点击 Installing Jenkins&#xff1a; 点击 Linux&#xff1a; 选择 Red Hat/…

H3C IMC dynamiccontent.properties.xhtm 远程命令执行

我举手向苍穹&#xff0c;并非一定要摘星取月&#xff0c;我只是需要这个向上的、永不臣服的姿态。 构造payload&#xff1a; /imc/javax.faces.resource/dynamiccontent.properties.xhtml pfdrtsc&lnprimefaces&pfdriduMKljPgnOTVxmOB%2BH6%2FQEPW9ghJMGL3PRdkfmbii…

智慧公厕设备选型攻略,打造智能化便利生活体验

智慧公厕设备的选型对于打造智能化便利生活体验起着至关重要的作用。在不断提升城市品质的背景下&#xff0c;智慧公厕已成为城市建设中的一项重要内容。在选购智慧公厕设备时&#xff0c;我们需要考虑到不同版本的功能要求&#xff0c;确保公厕设备的质量和性能。本文以智慧公…

[代码随想录]回溯、贪心算法篇

文章目录 1.回溯算法1.1 77-组合1.2 216-组合的综合III1.3 17-电话号码的字母组合1.4 39-组合总和1.5 40-组合总和II1.6 131-分割回文串1.7 93-复原IP地址1.8 78-子集1.9 90-子集II1.10 491-递增子序列1.11 46-全排列1.12 47-全排列II1.13* 51-N皇后 2. 贪心算法2.1 455-分发饼…

QCC 音频输入输出

QCC 音频输入输出 QCC蓝牙芯片&#xff08;QCC3040 QCC3083 QCC3084 QCC5181 等等&#xff09;支持DAC、I2S、SPDIF输出&#xff0c;AUX、I2S、SPDIF、A2DP 输入 蓝牙音频输入&#xff0c;模拟输出是最常见的方式。 也可以再此基础上动态切换输入方式。 输入方式切换参考 sta…

设计模式:命令模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

简介&#xff1a; 命令模式&#xff0c;它是一种行为型设计模式&#xff0c;它尝试将请求或操作封装成对象&#xff0c;从而降低系统的耦合度&#xff0c;增加系统的可扩展性&#xff0c;并支持撤销、重做、事务等功能。 在命令模式中&#xff0c;请求被封装为一个独立的对象…

postgresql14-模式的管理(三)

基本概念 postgresql成为数据库管理系统DBMS&#xff0c;在内存中以进程的形态运行起来成为一个实例&#xff0c;可管理多个database。 数据库databases&#xff1a;包含表、索引、视图、存储过程&#xff1b; 模式schema&#xff1a;多个对象组成一个模式&#xff0c;多个模…

09-React路由使用(React Router 6)

9-React Router 6的使用 1.概述 React Router 以三个不同的包发布到 npm 上&#xff0c;它们分别为&#xff1a; react-router: 路由的核心库&#xff0c;提供了很多的&#xff1a;组件、钩子。react-router-dom: 包含react-router所有内容&#xff0c;并添加一些专门用于 DOM …

期中考misc复现

第一题 flow analysis 1 服务器附带的后门文件名是什么&#xff1f;&#xff08;包括文件后缀&#xff09; webshell是网站的后门&#xff0c;也是一个命令解释器。不过是以http协议这样的方式通信。继承了web权限 我们过滤http和https http && http.response.code…