c++ type_info and typeid
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的更多相关文章
- c++中获得对象类型 typeid 与 type_info
复杂部分略去,摘录要素如下: 1.typeid是C++的关键字之一,等同于sizeof这类的操作符. 2.typeid操作符的返回结果是名为type_info的标准库类型的对象的引用(在头文件type ...
- C++ typeid实现原理
最近看了boost::any类源码,其实现主要依赖typeid操作符.很好奇这样实现的时间和空间开销有多大,决定探一下究竟. VS2008附带的type_info类只有头文件,没有源文件,声明如下: ...
- 从零开始学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 ...
- C++中模板单例的跨SO(DLL)问题:RTTI,typeid,static,单例
(转载请注明原创于潘多拉盒子) C++的模板可以帮助我们编写适合不同类型的模板类,给代码的复用性提供了极大的方便.近来写了一个涉及单例的C++模板类,简化下来可以归结为以下的代码: template ...
- RTTI、dynamic_cast、typeid、类与类之间的关系uml
一.RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be deter ...
- C++运行时类型判断dynamic_cast和typeid
dynamic_cast dynamic_cast < Type-id > ( expression ) dynamic_cast<类型>(变量) 在运行期间检测类型转换是否安 ...
- 《InsideUE4》UObject(二)类型系统概述
曾子曰:吾日三省吾身--为人谋而不忠乎?与朋友交而不信乎?传不习乎? 引言 上一篇我们谈到了在游戏引擎,或者在程序和高级编程语言中,设计一个统一对象模型得到的好处,和要付出的代价,以及在UE里是怎么对 ...
- C 语言Struct 实现运行类型识别 RTTI
通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型.c++通过下面两个操作符提供RTTI. (1)typeid:返回指针或引用所指对象的实际类型. (2)dynamic_cast: ...
- C++ 关键字浅谈
这里有一个游戏:要求写一个符合C++标准的程序,包含至少十个连续而且不同的关键字.连续是指不能被标识符.运算符.标点符号分割.注意这里的“不同”要求,别想用 int main() { return s ...
随机推荐
- Flex条件判断中注意事项
1:等于判断条件,一定注意写两个==等号, if (obj.ProcessType="Relation") 如果只写一个等号,编译不会报错,并且Flex会认为是赋值操作,并且该语句 ...
- C++ string 类的 find 方法实例详解
1.C++ 中 string 类的 find 方法列表 size_type std::basic_string::find(const basic_string &__str, size_ty ...
- 前端自动化工具 -- fis 使用简介
https://github.com/fex-team/fis FIS入门: http://fis.baidu.com/docs/beginning/getting-started.html FIS ...
- css3效果
1. 放大图片: /*galleryImage css*/ a.galleryImage{ display:block;} .galleryImage img{ transition:all .4s ...
- php以post方式向接口发送数据
工作需要,我负责收集服务器数据,然后定时向中心服务器发送.我看到了接口信息,需要设置heads头信息,需要发送数据,且是post方式. 这里就用到了curl //发送post请求 function r ...
- 演示一个导致ora-01555错误的场景
1创建一个undo表空间 2查看当前undo配置 3更该默认undo表空间 4确认更改的配置 5创建一张测试表 6模拟批量操作 7 查询2分钟前的数据 从这里可以到当查询2分钟前的数据时候,系统报出O ...
- free一个无效指针
1. 错误描述: 刚才写了一个删除单链表的结点函数, 参数是 指向链表的指针和链表中指定删除的结点的指针. 当我free这个待删除的结点, 结果报错. 2. 为什么会报错? 我查了查MSDN, ...
- Mysql5.5命令行修改密码
今天下载了mysql5.5.45免安装版,配置好之后发现mysql默认是没有设置密码的,也就是密码为空. 如果是本机作开发测试用,有无密码倒也无所谓,不过发布在服务器上没有密码肯定是不行的,那就需要设 ...
- ExtJS笔记 Form
A Form Panel is nothing more than a basic Panel with form handling abilities added. Form Panels can ...
- 20145224&20145238《信息安全系统设计基础》实验四
20145224陈颢文20145238荆玉茗 <信息安全系统设计基础>第四次实验报告 课程:信息安全系统设计基础 班级: 1452 姓名:荆玉茗 陈颢文 学号:20145238 20145 ...