c++ type_info and typeid

typeid

关键字typeid提供了对一个对象查询类型的功能。 该关键字和dynami_cast一起提供了c++的RTTI(rumtime type identification)支持.


struct MyStruct
{
int i;
};
int _tmain(int argc, _TCHAR* argv[])
{
int i(0);
double j(1.0);
MyStruct myObj; cout << typeid(int).name() << endl;
cout << typeid(i).name() << endl;
cout << typeid(&i).name() << endl;
cout << typeid(MyStruct).name() << endl;
cout << typeid(myObj).name() << endl;
cout << typeid(&myObj).name() << endl;
return 0;
}

结果为:

但是等等, typeid不是运行时确定的吗, 为什么cout << typeid(int).name() << endl;这样的代码是可以的。 那是因为:


When applied to an expression of polymorphic type, evaluation of a typeid expression may involve runtime overhead (a virtual table lookup), otherwise typeid expression is resolved at compile time.


好吧, c++编译器果然据说是这个世界上最难写的编译器了。

std::type_info

typeid 返回的是类type_info的对象,它由标准库提供,在"typeinfo"中实现。但是我们不能直接使用std::type_info,它提供了以下几个方法:

  • operator==
  • operator!=
  • before
  • name
  • raw_name
  • hash_code

std::type_info info = typeid(int);

type_info::type_info(const type_info &)”: 尝试引用已删除的函数


那是因为type_info的构造函数和operator=函数都被删除的


__CLR_OR_THIS_CALL type_info(const type_info&) = delete;

type_info& __CLR_OR_THIS_CALL operator=(const type_info&) = delete;

但是我们可以这么使用:


const std::type_info& info = typeid(int);
bool same = (info == typeid(int));
cout << same << endl;

总结

理解了 type_info & typeid的用法以及细节

c++ type_info and typeid的更多相关文章

  1. c++中获得对象类型 typeid 与 type_info

    复杂部分略去,摘录要素如下: 1.typeid是C++的关键字之一,等同于sizeof这类的操作符. 2.typeid操作符的返回结果是名为type_info的标准库类型的对象的引用(在头文件type ...

  2. C++ typeid实现原理

    最近看了boost::any类源码,其实现主要依赖typeid操作符.很好奇这样实现的时间和空间开销有多大,决定探一下究竟. VS2008附带的type_info类只有头文件,没有源文件,声明如下: ...

  3. 从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml

    一.RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be deter ...

  4. C++中模板单例的跨SO(DLL)问题:RTTI,typeid,static,单例

    (转载请注明原创于潘多拉盒子) C++的模板可以帮助我们编写适合不同类型的模板类,给代码的复用性提供了极大的方便.近来写了一个涉及单例的C++模板类,简化下来可以归结为以下的代码: template ...

  5. RTTI、dynamic_cast、typeid、类与类之间的关系uml

    一.RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be deter ...

  6. C++运行时类型判断dynamic_cast和typeid

    dynamic_cast dynamic_cast < Type-id > ( expression ) dynamic_cast<类型>(变量) 在运行期间检测类型转换是否安 ...

  7. 《InsideUE4》UObject(二)类型系统概述

    曾子曰:吾日三省吾身--为人谋而不忠乎?与朋友交而不信乎?传不习乎? 引言 上一篇我们谈到了在游戏引擎,或者在程序和高级编程语言中,设计一个统一对象模型得到的好处,和要付出的代价,以及在UE里是怎么对 ...

  8. C 语言Struct 实现运行类型识别 RTTI

    通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型.c++通过下面两个操作符提供RTTI. (1)typeid:返回指针或引用所指对象的实际类型.    (2)dynamic_cast: ...

  9. C++ 关键字浅谈

    这里有一个游戏:要求写一个符合C++标准的程序,包含至少十个连续而且不同的关键字.连续是指不能被标识符.运算符.标点符号分割.注意这里的“不同”要求,别想用 int main() { return s ...

随机推荐

  1. 给ListView视图添加行号

    最后的效果如下: 更新,集成一个独立的模块而不改变源文件的方式更为稳妥. 购买地址:https://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-26531 ...

  2. Address already in use:JVM_Bind

    1.原因:端口被占用 2.解决方式: 方式一:重启电脑 方式二:方式一不行执行方式二 双击Tomcat server   将Ports下HTTP/1.1对应的Port Number 改为其他值 备注: ...

  3. php标签云制作——数据表的结构和查询方法

    1.数据表的结构: 创建建两张数据表,结构如下: 标签tag表: 文章mood表: 其中mood表中的tag字段,以tag表的id字段+“,”+tag表的id字段, 2.查询方法: 例如:如果需要某篇 ...

  4. oracle结构与安全

    从宏观上来看:oracle数据库服务器主要有数据库和实例组成. 在orale数据库服务器中,首先会产生一个实例,通过实例访问一个数据库. 一个实例对应着一个数据库. oracle 数据库在逻辑上是按层 ...

  5. tomcat启动闪退

    TOMCAT启动时报错:the CATALINA_HOME environment variable is not defined correctly 运行tomcat/bin目录下的startup. ...

  6. windows下vim 块模式问题

    VIM: gvim 使用 Ctrl+V 發表於 2005 年 10 月 27 日 由 Tsung vim 要做垂直選取的動作, 就要使用 "Ctrl + v", 但是 gvim 會 ...

  7. IOS第18天(4,核心动画,时钟效果,定时器,图片旋转角度,CALayer 锚点,获取当前,小时,秒,分)

    **** #import "HMViewController.h" // 每秒秒针转6度 #define perSecendA 6 // 每分钟分针转6度 #define perM ...

  8. 【iCore3 双核心板】例程三十三:SD_IAP_ARM实验——更新升级STM32

    实验指导书及代码包下载: http://pan.baidu.com/s/1jHmvQfk iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  9. Bootstrap:表格和栅格分页

      拼接table请将以下代码直接运行:换下 bootstrap.css jquery-1.12.3.min.js bootstrap-paginator.min.js" <!DOCT ...

  10. Nginx配置proxy_pass转发的/路径问题

    Nginx配置proxy_pass转发的/路径问题 在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/,当加上了/,相当于是绝对根路径,则 ...