c++中获得对象类型 typeid 与 type_info
复杂部分略去,摘录要素如下:
1.typeid是C++的关键字之一,等同于sizeof这类的操作符。
2.typeid操作符的返回结果是名为type_info的标准库类型的对象的引用(在头文件typeinfo中定义)
3.C++并没有规定typeid实现标准,各个编译器可能会不一样。
4.编译器会为每一种typeid操作的类型生成一份保存在数据段的type_info数据。
5.每种类型的type_info数据长度依赖于类型名称,至少9个字节。
个人实测总结如下:
1.返回类型
typeid返回的是type_info的引用,这个类不能拷贝,也不能自己构造。
在语法上要使用const type_info & 类型来定义一个对象
type_info.name()的返回类型是一个const char* 静态字符串
2.可用操作集
-> 创建一个引用对象 const type_info& t0 = typeid(int);
-> 获得类型名称 const char* b=t0.name();
cout<<b<<" " <<t0.name()<<endl;
->比较对象是否相等,仅支持2种比较符
t1 == t2 ,t1 != t2
程序实例:
#include<iostream>
#include<typeinfo>
#include<cstring>
using namespace std;
int main(void){
int i = 1;
float f = 1.222;
//定义引用对象
const type_info& t1 = typeid(f);
const type_info& t2 = typeid(int);
//获得类型名称
const char* a=t1.name();
const char* b=t1.name();
//比较对象相等
cout<<"ti==t2 ? "<< t1==t2<<endl;
return 0;
}
3.不同编译器的机能的理解
在devc++5.11中
float f = 1.222;
cout<<typeid(f).name();
输出
>>f
在vs2013中
float f = 1.222;
cout<<typeid(f).name();
输出
>>float
可见简陋的devc++,对于变量的类型处理不科学。
会直接创建一个新的type_info对象,储存的private:name 是传入的变量名称
但是在devc++中直接输入类型名称是可以的
float f = 1.222;
cout<<typeid(float).name();
输出
>>float
只要输入的是类型名称,后续的其他操作,例如比较typeid(float)==typeid(int),在devc++中都是正常的。
c++中获得对象类型 typeid 与 type_info的更多相关文章
- JavaScript中判断对象类型方法大全1
我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...
- JavaScript中判断对象类型的种种方法
我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...
- jquery中关于对象类型的判断原理
class2type[ core_toString.call(obj) ] jquery中关于对象类型的判断原理 jquery源码中关于类型判断的工具函数为type,调用方法为$.type()或者jQ ...
- 转 JavaScript中判断对象类型的种种方法
我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...
- 获得函数返回值类型、参数tuple、成员函数指针中的对象类型
//function_traits.h,获得函数返回值类型.参数tuple.成员函数指针中的对象类型 //参考https://github.com/qicosmos/cosmos/blob/maste ...
- js中判断对象类型的几种方法
我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...
- Python中的对象类型的初步介绍
一:介绍 1.为什么使用内置对象 对象类型是语言的一个部分 内置对象构成了每个python程序的核心部分 2.核心数据类型 数字 字符串 列表 字典 元组 文件 集合 其他类型 编程单元类型 与实现相 ...
- JavaScript中判断对象类型方法大全2
在JavaScript中,有5种基本数据类型和1种复杂数据类型,基本数据类型有:Undefined, Null, Boolean, Number和String:复杂数据类型是Object,Object ...
- 浅谈String中的==和对象中引用对象类型的==
@Test public void test02() { StringBuffer sb = new StringBuffer(); sb.append('a'); sb.append(11); Sy ...
随机推荐
- Java学习——String,StringBuffer和StringBuilder
Java学习——String,StringBuffer和StringBuilder 摘要:本文主要介绍了String字符串在内存中的存储情况,以及StringBuffer和StringBuilder的 ...
- 小鸟初学Shell编程(三)脚本不同执行方式的影响
执行命令的方式 执行Shell脚本的方式通常有以下四种 方式一:bash ./test.sh 方式二:./test.sh 方式三:source ./test.sh 方式四:. ./test.sh 执行 ...
- java9模块不可见问题
问题描述 jdk.internal.reflect包不可见 问题原因 java9模块化之后,java.base只把jdk.internal.reflect暴露给了少数几个内部包而没有向当前模块暴露. ...
- swift(二)swift字符串和字符和逻辑运算
/* 1.swift字符串和字符 2.构造字符串 3.字符串比较 4.数值运算 5.复制运算 6.关系运算 7.逻辑运算 8.区间运算 */ /* //数据 + 数据的处理 //字符信息+ 字符信息的 ...
- bootstrap基础样式学习(二)——栅格
(1)最外层必须使用容器 div.container或 div.container-fluid (2)容器可以放置任何内容,若想使用栅格系统必须用 div.row div.container > ...
- 【Mysql】初识MySQL
一. MySQL是客户端/服务器架构1)macOS操作系统上的默认安装目录:/usr/local/mysql/ 在MySQL的安装目录下有一个bin目录,这个目录下存放着许多可执行文件.2)将该bi ...
- 使用IDEA创建Maven项目和Maven使用入门(配图详解)
本文详解的讲解了使用IDEA创建Maven项目,及Maven的基础入门. 1.打开IDEA,右上角选择File->New->Project 2.如图中所示选择Maven(可按自己所需添加, ...
- mysql-存储过程-触发器-事务---4
本节所讲内容: 存储过程 触发器 事务 一.存储过程 什么是存储过程 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成.存储过程(S ...
- Nginx内置变量以及日志格式变量
$args #请求中的参数值$query_string #同 $args$arg_NAME #GET请求中NAME的值$is_args #如果请求中有参数,值为"?",否则为空字符 ...
- zz:一个框架看懂优化算法之异同 SGD/AdaGrad/Adam
首先定义:待优化参数: ,目标函数: ,初始学习率 . 而后,开始进行迭代优化.在每个epoch : 计算目标函数关于当前参数的梯度: 根据历史梯度计算一阶动量和二阶动量:, 计算当前时刻的下降 ...