首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C++:用于区分类型的type_info

C++:用于区分类型的type_info
EN

Stack Overflow用户
提问于 2010-11-16 12:39:20
回答 6查看 18.8K关注 0票数 19

我知道编译器在实现std::type_info函数的行为方面有很大的自由度。

我正在考虑使用它来比较对象类型,所以我想确保:

  1. std::type_info::name必须为两个不同的types.
  2. std::type_info::before返回两个不同的字符串必须说明Type1Type2 exclusive之前-或者 Type2Type1之前。

//像这样: typeid(T1).before( typeid(T2) ) != typeid(T2).before( typeid(T1) )

  • 同一模板类的两个不同的专门化被认为是不同的类型。

  • 同一类型的两个不同的typedef-initions是相同的类型。

最后:

  • 由于std::type_info是不可复制的,我如何将type_info存储在某个地方(例如:在std::map中)?让std::type_info始终分配到某个地方(例如:堆栈或静态/全局变量)并使用指向它的指针的唯一方法是什么?
  • 在大多数常见的编译器上,operator==operator!=before有多快?我想他们应该只比较一个值。typeid
  • I've获得带有virtual bool operator==( const A& ) const的类A的速度有多快。因为A有很多子类(其中一些在编译时是未知的),所以我会以这种方式重载任何子类B中的虚拟操作符:

虚拟bool operator==( const A &other ) const { if( typeid(*this) != typeid( other ) ) return false;//为任何B类定义B::operator==( const B &other ) const //返回operator==( static_cast( Other) );}

这是一种可接受的(和标准的)实现这种运算符的方式吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-11-16 13:04:42

在快速浏览文档之后,我会说:

对于两个不同的类型,

  1. std::type_info::name总是返回两个不同的字符串,否则这意味着编译器在解析类型时丢失了自己,您不应该使用它。anymore.
  2. Reference告诉:“如果类型在排序顺序中位于rhs的类型之前,则返回true。排序顺序只是一个由特定实现保持的内部顺序,并不一定与继承关系或声明顺序相关。”因此,您可以保证没有类型在排序顺序中具有相同的排名。
  3. 模板类的每个实例化都是不同的类型。专门化也不例外。
  4. 我真的不明白你的意思。如果您指的是将typedef foo bar;放在两个单独的编译单元中,而这两个编译单元中的栏是相同的,那么它就是这样工作的。如果你指的是typedef foo bar; typedef int bar;,它就不能工作(除非foo是int)。

关于你的其他问题:

你应该存储对std::type_info的引用,或者包装它,而不考虑性能,我假设比较运算符有恒定的时间,尽管类型复杂。之前必须有线性复杂度,这取决于你的代码中使用的不同类型的数量。,

  • ,这真的很奇怪。您应该重载您的operator==,而不是将其设置为虚拟并覆盖它。
票数 8
EN

Stack Overflow用户

发布于 2010-11-16 12:48:36

标准18.5.1 (type_info类):

类type_info描述由实现生成的类型信息。此类的对象有效地存储了一个指向类型名称的指针,以及一个适合比较两种类型是否相等或排序顺序的编码值。类型的名称、编码规则和排序顺序都是未指定的,在不同的程序中可能会有所不同。

据我所知:

  1. ,你没有关于std:type_info::name的保证。这个标准只说明了behavior.
  2. That返回一个实现定义的name,我相信一个符合标准的实现可以为每个类型返回相同的字符串。
  3. 我不知道,标准在这一点上也不是很清楚,所以我不会依赖这样的NTBS应该是一个明确的‘name’for me
  4. 应该是一个明确的'Yes‘for me

关于第二组问题:

  • 否,您不能存储type_info。Andrei Alexandrescu在其Modern C++ Design一书中提出了一个TypeInfo包装器。请注意,由typeid 返回的对象具有静态存储,因此您可以安全地存储指针,而无需担心对象的生存期
  • 我相信您可以假定type_info比较非常有效(实际上没有太多可比较的内容)。
票数 4
EN

Stack Overflow用户

发布于 2010-11-16 12:51:48

您可以像这样存储它。

代码语言:javascript
运行
AI代码解释
复制
class my_type_info
{
public:
     my_type_info(const std::type_info& info) : info_(&info){}
     std::type_info get() const { return *info_;}
private:
     const std::type_info* info_;
};

编辑:

C++标准5.2.8。

类型表达式的结果是静态类型const std::type_info的左值...

这意味着你可以像这样使用它。

代码语言:javascript
运行
AI代码解释
复制
my_type_info(typeid(my_type));

typeid函数返回一个左值(它不是临时的),因此返回的type_info的地址总是有效的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4194191

复制
相关文章
云硬盘如何使用 各类型之间的区分
云硬盘是云端硬盘的简称,这个硬盘是一项提供15G免费空间的网盘服务。它不仅能够存储各式各样的档案与文件,还能随时随地与他人分享。现如今信息网络发达,云硬盘的方便快捷显然成为优势。但究其根本,那云硬盘怎么使用呢?
用户8715145
2021/12/24
1.4K0
C++用于修饰的keyword
(1)const int *p=&x:不可改动*p的内容,但能够让指针p指向还有一个地址,和int const *p一样
全栈程序员站长
2022/07/14
2720
C++的类型转换
(1) static_cast会在编译的过程中进行安全性检查, 相对与dynamic_cast是静态转换;
Qt君
2019/07/16
8010
【C++】C++中的类型转化
说起类型转化,我们在C语言之前的学习中可以了解到,类型转换可以分为两种情况:隐式类型转化;显示类型转化。但是为什么在c++中还要继续对类型转化做文章呢?我们一起来看:
The sky
2023/04/30
1.1K0
【C++】C++中的类型转化
C++的类型转换
在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。
二肥是只大懒蓝猫
2023/03/30
8970
C++的类型转换
论编程界的日经问题:到底如何区分静态类型和动态类型、强类型和弱类型?
博主在本文中探讨了编程界常见的问题,即如何区分静态类型和动态类型,强类型和弱类型。他指出,由于这些概念本身没有明确的定义,导致人们很难就此达成一致共识。然而,如果按照已有的共识来界定这些概念,就能得出一些明确的答案。文章提到了强类型语言和弱类型语言的区别,以及静态类型语言和动态类型语言的区别。在强类型和弱类型的定义中,强类型语言常常会直接出错或编译失败,而弱类型语言会进行隐式转换或产生意料之外的结果。根据这个定义,Python被归类为强类型语言。静态类型语言在编译期确定变量类型,而动态类型语言在运行时确定。根据这个区别,C, C++, C#, Java等被视为静态类型语言,而Python, JavaScript, TypeScript, PHP等被视为动态类型语言。最后,博主表示这种讨论对工程开发的实际意义并不大。
HikariLan贺兰星辰
2023/10/18
4710
C++的类型转换
1)static_cast<>() 静态类型转换,编译的时c++编译器会做类型检查;
C语言与CPP编程
2021/08/27
1.7K0
typeid与decltype[通俗易懂]
C++在C++98标准中就部分支持动态类型了,C++98对动态类型支持就是C++中的运行时类型识别RTTI。
全栈程序员站长
2022/10/29
6590
从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
该文讲述了如何利用RTTI、dynamic_cast、typeid、类与类之间的关系来处理运行时多态性。作者详细讲解了RTTI、dynamic_cast、typeid、类与类之间的关系,以及如何使用这些工具来处理运行时多态性。
s1mba
2018/01/03
8680
从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
C++的数据类型
C++是一种强类型语言。C++程序中的任何变量(或函数)必须遵循“先说明后使用”的原则。定义数据类型有两个方面的作用:一是决定该类型的数据在内存中如何存储,二是决定可对该类型的数据进行哪些合法的运算。
恋喵大鲤鱼
2018/08/03
6490
C++的数据类型
c++ 默认类型的转换
对于C/C++语言来说,在通常情况下语句和表达式的操作通常只使用一种类型的变量和常量。但在实际的开发中,往往会有不同类型的变量之间进行运算,为了满足这样的代码需求,通常在编译器中会设置不同类型自动类型转换,以完成相应的运算。但是如果我们对这样的自动类型转换不熟悉,往往会写出错误的代码,令人摸不清头脑,这种错误往往也是严重的。
lexingsen
2022/02/24
6500
c++ 默认类型的转换
C++中的POD类型
几乎所有的系统底层都是用C写的,当时定义的基本数据类型比如int、char、float、枚举、指针、数组和结构等通过二进制拷贝后还能保持数据不变,即编译器可以通过二进制数据将该类型正确解析出来。C++中的类类型引入了继承和派生等新概念,编译器无法解析这些复杂数据结构,因此C++提出POD数据结构的概念用于兼容C语言,由于C++中基本内置类型都是POD类型,因此我们一般讨论class、struct和union是否是POD类型的。
TOMOCAT
2021/04/16
3.1K0
C++中的类型转换
C++的类型转换 零、前言 一、C语言的类型转换 二、C++强制类型转换 1、static_cast 2、reinterpret_cast 3、const_cast 4、dynamic_cast 5、explicit 三、常见面试题 零、前言 本章主要学习C++的四种类型转换 一、C语言的类型转换 概念及介绍: 在C语言中,如赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化 C语言中的两种形式的类型转换: 隐式类型转化:编译器在编
用户9645905
2022/11/15
2K0
C++判断类型的模板
介绍一些判断类型的模板。   下列模板中包 含于头文件<type_traits>(C++11起引入)。 检查类型是否为void is_void 检查类型是否为std::nullptr_t   C++14起引入。 is_null_pointer 检查类型是否为整数类型 is_integral 检查类型是否为浮点类型 is_floating_point 检查类型是否为数组类型 is_array 检查类型是否为枚举类型 is_enum 检查类型是否为联合类型 is_union 检查类型是否为非联合的
Qt君
2020/08/04
3.6K1
用于查询的日期类型转换帮助类
本文转载:http://www.cnblogs.com/iamlilinfeng/p/3378659.html
跟着阿笨一起玩NET
2018/09/19
7870
用于查询的日期类型转换帮助类
RTTI简介
RTTI(Runtime Type Identification)是“运行时类型识别”的意思。面向对象的编程语言,像C++,Java,Delphi都提供了对RTTI的支持。 本文将简略介绍 RTTI 的一些背景知识、描述 RTTI 的概念,并通过具体例子和代码介绍什么时候使用以及如何使用 RTTI。本文还将详细描述两个重要的RTTI运算符的使用方法,它们是typeid和dynamic_cast。
恋喵大鲤鱼
2019/02/22
1.5K0
C++类型转换
允许将任何指针类型转换为其它的指针类型;听起来很强大,但是也很不靠谱。它主要用于将一种数据类型从一种类型转换为另一种类型。它可以将一个指针转换成一个整数,也可以将一个整数转换成一个指针,在实际开发中,先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原来的指针值;特别是开辟了系统全局的内存空间,需要在多个应用程序之间使用时,需要彼此共享,传递这个内存空间的指针时,就可以将指针转换成整数值,得到以后,再将整数值转换成指针,进行对应的操作。
用户2929716
2018/08/23
7310
C++类型转换
RTTI简介
RTTI是Runtime Type Identification的缩写,是“运行时类型识别”的意思。面向对象的编程语言,象C++,Java,Delphi都提供了对RTTI的支持。 本文将简略介绍 RTTI 的一些背景知识、描述 RTTI 的概念,并通过具体例子和代码介绍什么时候使用以及如何使用 RTTI。本文还将详细描述两个重要的 RTTI 运算符的使用方法,它们是 typeid 和dynamic_cast。
恋喵大鲤鱼
2018/08/03
5500
【C++】类型转换
在 C 语言中,如果 赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化 , C 语言中总共有两种形式的类型转换: 隐式类型 转换和显式类型转换 。
青衫哥
2023/10/17
1860
【C++】类型转换
【c++】类型转换
类型相近的才能发生隐式类型转换,如int和double,如果不相关,而对于指针和整型,指针是地址,整型和指针类型之间不会进行隐式类型转换,只能显式的强制类型转换:
平凡的人1
2023/10/15
2290
【c++】类型转换

相似问题

启动Visual Studio 2010时,调用的目标引发了异常

140

Visual Studio 2010错误:“调用的目标引发了异常”

41

Visual 2013中的ImageWatch :调用的目标引发了异常

16

“调用的目标引发了异常”

11

“调用的目标引发了异常。”构建Visual 2010 VSPackage时

510
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文