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


相关推荐

  • 联想笔记本键盘亮了屏幕不亮怎么办_电脑开机显示器和键盘都不亮

    联想笔记本键盘亮了屏幕不亮怎么办_电脑开机显示器和键盘都不亮联想电脑显示器不亮怎么办联想电脑显示器不亮解决方法一:1、开机后,我们先不管显示器是否能正常的亮或显示,我们先再次按主机上的重启键,然后我们按一下键中的“numlock”键,也就是台式键盘右边的数字开关切换键。2、如数字开关键上面的数字锁定灯可以正常的亮或正常的灭,这时就说明电脑主机一般没啥事儿了,基本上可以确定是由显示器本身的问题了。3、如无法显示正常的灯亮和灯灭的话,那么基本可以说明是电脑机…

    2022年9月20日
    1
  • 磁盘阵列的组建及维护技巧(图)

    磁盘阵列的组建及维护技巧(图)

    2021年8月9日
    63
  • javascript中一个字符占几个字节

    javascript中一个字符占几个字节一般来说英文是1个,中文是两个。但是会根据编码方式不同而不同。以下是搬运:英文字母和中文汉字在不同字符集编码下的字节数英文字母:字节数:1;编码:GB2312字节数:1;编码:GBK字节数:1;编码:GB18030字节数:1;编码:ISO-8859-1字节数:1;编码:UTF-8字节数:4;编码:UTF-16字节数:2;编码:UTF-16BE字节数…

    2025年5月31日
    2
  • idea激活码永久2022(注册激活)

    (idea激活码永久2022)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1TCF…

    2022年3月31日
    377
  • ftp文件上传及下载工具类[通俗易懂]

    ftp文件上传及下载工具类[通俗易懂]1、ftp文件上传用例解析(需使用apacher的commons-net-3.3.jar)publicclassTestFtp{@Testpublicvoidtest()throwsException{//1、创建FTP客户端FTPClientftpClient=newFTPClient();//2、

    2022年6月6日
    26
  • MySQL数据库优化技巧大全

    MySQL数据库优化技巧大全

    2022年2月18日
    38

发表回复

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

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