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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • DFS(深度优先搜索算法)「建议收藏」

    DFS(深度优先搜索算法)「建议收藏」基本概念深度优先搜索算法(DepthFirstSearch,简称DFS):一种用于遍历或搜索树或图的算法。沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。算法思想回溯法(探索与回溯法…

    2022年6月18日
    32
  • 郴州市高考一段录取率(郴州市第一中学高考喜报)

    很多家长关心郴州2020年最新的中学排名,选择一所好的中学尤为重要,本文小编整理了一些关于2020年郴州最新的中学排名相关数据,仅供参考。一、郴州中学排名前十名名单排名学校名称1临武县第一中学2湖南省资兴市立中学3宜章县第一中学4湖南省郴州市第一完全中学5汝城县一中6桂阳县第一中学7安仁县第一中学8郴州市第二中学9永兴县第一中学10桂阳县第三中学11桂东县第一中学12嘉禾县第一中学二、郴州中学排名…

    2022年4月12日
    348
  • DB2维护手册

    DB2维护手册

    2021年5月7日
    137
  • 使用SecureCRTPortable的过程中出现的乱码问题解决方式

    使用SecureCRTPortable的过程中出现的乱码问题解决方式各位小伙伴好:可能大家都遇到过使用SecureCRTPortable【以下简称CRT】查日志的过程中出现乱码问题,下面超哥给各位普及下对于乱码的处理方式:1,有可能是当前连接的服务器显示的编码不是utf-8的编码,那样的话就直接修改字符编码就好了,2,当上面的方式不起作用的时候你需要检查下你服务器里的配置喽,第一:执行命令:more…

    2022年5月2日
    44
  • 姐姐「建议收藏」

    姐姐「建议收藏」姐姐

    2022年4月23日
    44
  • httprunner(3)用脚手架快速搭建项目

    httprunner(3)用脚手架快速搭建项目前言如何快速搭建一个httprunner项目呢?我们可以使用脚手架,脚手架就是自动地创建一些目录,形成一个项目的架构,不需要我们再手动的去创建查看创建新项目的命令先来查看一下帮助命令httpr

    2022年7月29日
    18

发表回复

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

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