美文网首页
c++关键字typeid

c++关键字typeid

作者: 拉普拉斯妖kk | 来源:发表于2021-01-15 17:35 被阅读0次
  • typeid是c++的一个关键字,typeid操作符的返回结果是标准库类型type_info对象的引用。

  • 但是,C++标准并没有明确定义type_info,其具体实现依赖于各个编译器。标准只规定了typeid操作符必需实现如下四种操作:

操作 说明
t1 == t2 如果两个对象t1和t2类型相同,则返回true;否则返回false
t1 != t2 如果两个对象t1和t2类型不同,则返回true;否则返回false
t.name() 返回类型的C-style字符串。由编译器决定,不一定就是真实的类型名
t1.before(t2) 判断t1是否位于t2的前面。类型排列顺序与编译器相关,基类不一定位于派生类的前面。
  • type_info的成员函数name返回类型的C-style字符串,但这个返回的类型名与程序中使用的相应类型名不一定一致,其返回值的实现由编译器决定,标准只要求每个类型返回的字符串是唯一的。

  • 和sizeof操作符类似,typeid的操作对象既可以是数据类型,也可以是表达式。

  • 使用typeid判断各种类型示例代码如下:

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

class Base{};
class Derived:public Base{};
void func1();
int func2(int n);

int main()  
{  
    int a = 10;
    int* b = &a;
    float c;
    double d;

    cout << typeid(a).name() << endl;
    cout << typeid(b).name() << endl;
    cout << typeid(c).name() << endl;
    cout << typeid(d).name() << endl;
    cout << typeid(Base).name() << endl;
    cout << typeid(Derived).name() << endl;
    cout << typeid(func1).name() << endl;
    cout << typeid(func2).name() << endl;
}  
  • Mac下使用clang++编译运行结果如下:
i
Pi
f
d
4Base
7Derived
FvvE
FiiE
  • 不像Java、C#等动态语言,C++运行时能获取到的类型信息非常有限,标准也定义的很模糊,如同“鸡肋”一般。在实际工作中,我们一般只使用type_info的“==”运算符来判断两个类型是否相同。
  • 再来看看下面的示例代码:
#include<iostream>  
#include <typeinfo>  
using namespace std; 

class Base{};
class Drived: public Base{};

int main()
{
    Base* pb;
    Drived d;
    pb = &d;

    if(strcmp(typeid(*pb).name(), typeid(Base).name()) == 0)
    {
        cout << "this is Base" << endl;
    }
    else if(strcmp(typeid(*pb).name(), typeid(Drived).name()) == 0)
    {
        cout << "this is Drived" << endl;
    }
    
    if(strcmp(typeid(d).name(), typeid(Base).name()) == 0)
    {
        cout << "this is Base" << endl;
    }
    else if(strcmp(typeid(d).name(), typeid(Drived).name()) == 0)
    {
        cout << "this is Drived" << endl;
    }
}
  • Mac下使用clang++编译运行结果如下:
this is Base
this is Drived
  • 从运行结果中可以看出,即使用基类指针指向派生类,但使用typeid判断的基类指针类型依然是基类指针。因此我们不能用typeid来判断基类指针实际指向的是否是某个派生类。

相关文章

  • c++关键字typeid

    typeid是c++的一个关键字,typeid操作符的返回结果是标准库类型type_info对象的引用。 但是,C...

  • typeid

    本文分析C++中typeid的实现原理 1. 前言 1.1 typeid C++里面的typeid是个运算符,返回...

  • C++如何优雅的打印出变量类型

    方法1:使用C++库自带的typeid函数 一般使用C++库中的typeid函数获取一个变量的类型,不过打印出来的...

  • 织梦dede:channel指定typeid子栏目调用curre

    dede:channel指定typeid时currentstyle无效 {dede:channel typeid=...

  • C语言和C++的区别到底有多少?不要再傻傻分不清楚了

    1、关键字 蓝色标注为C语言关键字,C++继承了C语言的所有关键字,以下红色标注为C++中含有但C语言没有的关键字...

  • typeid

    使用方法为typeid(var).name()name()是一个成员函数,不是成员变量。

  • c++第一讲

    目标 c++关键字 命名空间 c++输入和输出 缺省参数 函数重载 引用 内联 auto关键字 基于范围的for循...

  • C++学习笔记目录

    C++初步 C++数据长度 C/C++ 堆 栈 静态 常量 代码 区 static关键字 C++类和对象 C++引...

  • C++ RTTI的dynamic_cast函数

    这篇文章是C++ RTTI的后续,前面我们介绍了typeid()操作符,这篇文章介绍RTTI的另一个概念,即dyn...

  • C++类、对象

    一、类 类(Class)则是C++面向对象编程的实现方式。class是C++关键字,也是用于类声明的关键字。紧接c...

网友评论

      本文标题:c++关键字typeid

      本文链接:https://www.haomeiwen.com/subject/zcxiaktx.html