C++运行时获取类型信息的type_info类与bad_typeid异常

 更新时间:2016年01月15日 16:26:29   投稿:goldensun  
这篇文章主要介绍了C++运行时获取类型信息的type_info类与bad_typeid异常,是C++入门学习中的基础知识,需要的朋友可以参考下

type_info 类
type_info 类描述编译器在程序中生成的类型信息。此类的对象可以有效存储指向类型的名称的指针。 type_info 类还可存储适合比较两个类型是否相等或比较其排列顺序的编码值。类型的编码规则和排列顺序是未指定的,并且可能因程序而异。
必须包含 <typeinfo> 标头文件才能使用 type_info 类。 type_info 类的接口是:

class type_info {
public:
  virtual ~type_info();
  size_t hash_code() const
  _CRTIMP_PURE bool operator==(const type_info& rhs) const;
  _CRTIMP_PURE bool operator!=(const type_info& rhs) const;
  _CRTIMP_PURE int before(const type_info& rhs) const;
  _CRTIMP_PURE const char* name() const;
  _CRTIMP_PURE const char* raw_name() const;
};

您不能直接实例化 type_info 类的对象,因为该类只有一个私有复制构造函数。构造(临时)type_info 对象的唯一方式是使用 typeid 运算符。由于赋值运算符也是私有的,因此不能复制或分配类 type_info 的对象。
type_info::hash_code 可定义适合将 typeinfo 类型的值映射到索引值的分布的哈希函数。
运算符 == 和 != 分别用于与其他 type_info 对象比较是否相等和不相等。
类型的排列顺序与继承关系之间没有关联。使用 type_info::before 成员函数可确定类型的排序顺序。不能保证 type_info::before 在不同的程序中(甚至是多次运行同一程序时)会产生相同的结果。这样,type_info::before 类似于 address-of (&) 运算符。
type_info::name 成员函数可将 const char* 返回到以 null 结尾的字符串,该字符串表示类型的用户可读名称。将缓存所指向的内存,应该从不直接释放它。
type_info::raw_name 成员函数可将 const char* 返回到以 null 结尾的字符串,该字符串表示对象类型的修饰名称。该名称实际上以其修饰的形式存储以节省空间。因此,此函数比 type_info::name 更快,因为它不需要取消修饰名称。 type_info::raw_name 函数返回的字符串在比较运算符中很有用,但它不可读。如果您需要用户可读的字符串,请改用 type_info::name 函数。

bad_typeid 异常
当 typeid 的操作数是 Null 指针时,typeid 运算符将引发 bad_typeid 异常。
语法

  catch (bad_typeid)
statement

备注
bad_typeid 的接口为:

class bad_typeid : public exception
{
public:
  bad_typeid(const char * _Message = "bad typeid");
  bad_typeid(const bad_typeid &);
  virtual ~bad_typeid();
};

以下示例演示引发 bad_typeid 异常的 typeid 运算符。

// expre_bad_typeid.cpp
// compile with: /EHsc /GR
#include <typeinfo.h>
#include <iostream>

class A{
public:
  // object for class needs vtable
  // for RTTI
  virtual ~A();
};

using namespace std;
int main() {
A* a = NULL;

try {
  cout << typeid(*a).name() << endl; // Error condition
  }
catch (bad_typeid){
  cout << "Object is NULL" << endl;
  }
}

输出

Object is NULL

相关文章

  • C语言数组栈实现模板

    C语言数组栈实现模板

    这篇文章主要为大家详细介绍了C语言数组栈实现模板,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 如何利用C语言实现最简单的HTTP服务器详解

    如何利用C语言实现最简单的HTTP服务器详解

    这篇文章主要给大家介绍了关于如何利用C语言实现最简单的HTTP服务器的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • C++稀疏矩阵的各种基本运算并实现加法乘法

    C++稀疏矩阵的各种基本运算并实现加法乘法

    今天小编就为大家分享一篇关于C++稀疏矩阵的各种基本运算并实现加法乘法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • c++实现逐行读取配置文件写入内存的示例

    c++实现逐行读取配置文件写入内存的示例

    这篇文章主要介绍了c++实现逐行读取配置文件写入内存的示例,需要的朋友可以参考下
    2014-05-05
  • C++使用BitBlt进行窗口抓图的方法

    C++使用BitBlt进行窗口抓图的方法

    这篇文章主要介绍了C++使用BitBlt进行窗口抓图的方法,帮助大家更好的理解和使用c++,感兴趣的朋友可以了解下
    2021-01-01
  • C语言实现词法分析器

    C语言实现词法分析器

    这篇文章主要为大家详细介绍了C语言实现词法分析器,一个简单的词法分析程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C++用mysql自带的头文件连接数据库

    C++用mysql自带的头文件连接数据库

    现在正做一个接口,通过不同的连接字符串操作不同的数据库。要用到mysql数据库。通过网上的一些资料和自己的摸索,大致清楚了C++连接mysql的方法。可以通过2种方法实现。第一种方法是利用ADO连接,第二种方法是利用mysql自己的api函数进行连接。今天主要来讲解下使用API
    2016-07-07
  • 在Ubuntu中安装VSCode并配置C/C++开发环境的方法步骤

    在Ubuntu中安装VSCode并配置C/C++开发环境的方法步骤

    这篇文章主要介绍了在Ubuntu中安装VSCode并配置C/C++开发环境的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • C语言学生成绩管理系统课程设计word版

    C语言学生成绩管理系统课程设计word版

    这篇文章主要为大家详细介绍了C语言学生成绩管理课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • 深入理解C预处理器

    深入理解C预处理器

    下面小编就为大家带来一篇深入理解C预处理器。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08

最新评论