typeid与decltype[通俗易懂]

typeid与decltype[通俗易懂]C++在C++98标准中就部分支持动态类型了,C++98对动态类型支持就是C++中的运行时类型识别RTTI。RTTI的机制是为每个类型产生一个type_info类型的数据,程序员可以在程序中使用typeid随时查询一个变量的类型,typeid就会返回变量相应的type_info数据,而type_info的name成员函数可以返回类型的名字。而在C++11中,又增加了hash_code这个成员函…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

C++在C++98标准中就部分支持动态类型了,C++98对动态类型支持就是C++中的运行时类型识别RTTI。

RTTI的机制是为每个类型产生一个type_info类型的数据,程序员可以在程序中使用typeid随时查询一个变量的类型,typeid就会返回变量相应的type_info数据,而type_info的name成员函数可以返回类型的名字。而在C++11中,又增加了hash_code这个成员函数,返回该类型唯一的哈希值,以供程序员对变量的类型随时进行比较。具体如下例:

#include <iostream>
#include <typeinfo>
using namespace std;

class White	{};
class Black {};
int main()
{
	White a;
	Black b;
	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;

	White c;
	bool a_b = (typeid(a).hash_code() == typeid(b).hash_code());
	bool a_c = (typeid(a).hash_code() == typeid(c).hash_code());
	cout << "a_b:" << a_b << endl;
	cout << "a_c:" << a_c << endl;
}

运行结果:

class White
class Black
a_b:0
a_c:1

除了typeid外,RTTI还包括了C++中的dynamic_cast等特性,很多时候,运行时才确定类型对于程序员来说为时已晚,程序员更多需要的是在编译时期确定出类型,因此RTTI无法满足要求。

在decltype产生之前,很多编译器的厂商都开发了自己的C++语言扩展用于类型推导。C++11则将这些类型推导手段进行了细致的考量,最终标准化为auto已经decltype。前者可以参考之前的博客,这里着重讲decltype,如下例:

int main()
{
	int i;
	decltype(i) j = 0;
	cout << typeid(i).name() << endl;
	float a;
	double b;
	decltype(a + b) c;
	cout << typeid(c).name() << endl;
}

运行结果:

int
double

从上例可以看出,decltype的类型推导并不像auto一样是从变量声明的初始化表达式获得变量的类型,decltype总是以一个普通的表达式为参数,返回该表达式的类型。而与auto相同的是,作为一个类型指示符,decltype可以将获得的类型来定义另外一个变量。与auto相同,decltype类型推导也是在编译时进行的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195588.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HTTP和HTTPS协议,看一篇就够了

    HTTP和HTTPS协议,看一篇就够了一、前言:我们上网很简单,只需要通过网络服务商开通端口就可以了,每天都在上网,有留意到访问网站链接有什么共同点吗?为什么需要但是为什么要讲HTTP和HTTPS呢?二、HTTP和HTTPS发展历史当我们打开谷歌浏览器输入www.12306.cn,回车很快在浏览器上就看到页面,其中的浏览器就是客户端,负责接受浏览器的是服务器,两者的通信是通过HTTP协议。什么是HTTP?…

    2022年4月29日
    74
  • WPF中ListBox的WrapPanel布局「建议收藏」

    WPF中ListBox的WrapPanel布局「建议收藏」WPF中ListBox的WrapPanel布局,如果排出来是纵向列表,原因是Theme错了。

    2022年7月23日
    32
  • Java 中的 int 型转为 long 型

    Java 中的 int 型转为 long 型先将int 型转为String 型,然后再将String 转为long 型,如下图: publicclassTestIntToLong{publicstaticvoidmain(String[]args){intnum=18;Stringstr=String.valueOf(num…

    2022年5月13日
    43
  • ArcGIS必会的几个工具的应用 –提取、分割、融合、裁剪(矢)、合并、追加、镶嵌、裁剪(栅)、重采样

    ArcGIS必会的几个工具的应用 –提取、分割、融合、裁剪(矢)、合并、追加、镶嵌、裁剪(栅)、重采样ArcGIS必会的几个工具的应用–提取、分割、融合、裁剪(矢)、合并、追加、镶嵌、裁剪(栅)、重采样GIS思维今天我们来聊聊ArcGIS中常用你又必须掌握的几个工具,如筛选、分割、融合、裁剪(矢量)、合并、追加、镶嵌、裁剪…

    2022年6月25日
    79
  • 代码走查1

    代码走查1线上问 和研发一起简单的从代码层面去解决问题 略 low 代码走查 1 存在的问题 SQL 查询 1 对于业务上没有用的字段没必要添加比如 IsDel 在具体的业务上 删除数据是直接硬删除 直接删除了物理数据 所以 在 SQL 查询的时候 SQL 读着可能没有问题 但实际执行却没有意义 没必要添加 2 不等于 查空值 要和判断语句相符合 不要在 SQL 语句中否定 而 if 判断中肯定 很容易迷茫

    2025年10月24日
    3
  • MPP架构详解_大数据中心架构详解

    MPP架构详解_大数据中心架构详解数据库构架设计中主要有SharedEverthting、SharedNothing、和SharedDisk:SharedEverthting:一般是针对单个主机,完全透明共享CPU/MEMORY/IO,并行处理能力是最差的,典型的代表SQLServerSharedDisk:各个处理单元使用自己的私有CPU和Memory,共享磁盘系统。典型的代表OracleRac,它是数据共…

    2025年5月30日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号