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


相关推荐

  • java—常量「建议收藏」

    java—常量「建议收藏」常量:在程序执行的过程中其值不可以发生改变。 1.java中常量分类:    A:字面值常量     字符串常量   用双引号括起来的内容      举例:"lixiaochi","liyan"     整数常量      所有整数      举例:12,23     小数常量      所有小数   …

    2022年7月8日
    24
  • mongodb导入json_json格式是什么

    mongodb导入json_json格式是什么刚开始接触mongodb,以下介绍使用mongoVUE来导入和导出json格式的数据1、导出瞬间导出到指定的text文件中,我们用文本编辑器打开预览2、导入导入的时候首先我我们要选择导入的表,点进去之后可以直接写json文本也可以导入,txt文件不过我们刚刚导出的json格式的txt文件是不能直接导入的,稍作一下修改,(需要的话去掉_id),去掉每个json串之间…

    2022年8月21日
    8
  • Web.xml配置详解之context-param

    Web.xml配置详解之context-param初始化过程:${initParam.contextConfigLocation}

    2022年7月1日
    24
  • CAS Service 部署流程(包含hppts的配置)

    CAS Service 部署流程(包含hppts的配置)一,通过maven命令打成war包然后部署到tomcat这步直接跳过了很简单百度搜索一样就可以二,这个时候访问http://localhost/cas/login(注意不是https)cas默认账户密码:casuser/Mellon如何改成https形式的访问 自签名服务端需要导入证书 PS: passport.sso.c…

    2022年10月2日
    3
  • 迭代和递归的理解和区别

    迭代和递归的理解和区别最近做一些题经常会碰到迭代的方法解的,或者递归解法,容易搞混,特在此整理一下一.递归:由例子引出,先看看递归的经典案例都有哪些1.斐波那契数列斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……这个数列从第三项开始,每一项都等于前两项之和。2.阶乘n!=n*(n-1)*(n-2)*…*1(n>0)3.汉诺塔问…

    2022年5月3日
    36
  • 复制粘贴不到远程桌面_远程怎么复制粘贴不了

    复制粘贴不到远程桌面_远程怎么复制粘贴不了在远程服务器上打开任务管理器,在进程里面找到rdpclip进程(或者剪贴板监视器),点击“结束进程”打卡DOS命令符,输入rdpclip后,确认,从新打开远程剪贴服务。

    2022年8月19日
    6

发表回复

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

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