大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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类型推导也是在编译时进行的。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195588.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...