C++11 | 运行时类型识别(RTTI)

                       

C++11里的RTTI更好用了,参见这里:http://en.cppreference.com/w/cpp/types。与RTTI相关的有几个类和方法:

  • type_info类
  • typeid操作符
  • type_index类

type_info

type_info类在头文件<typeinfo>中定义,代表了一个C++类型的相关信息。一般由typeid操作符返回,不能自己构造。

type_info是实现相关的,不同编译工具链的实现可能不一致。

下面的代码可以打印出int类型的名字:

    const std::type_info &tiInt = typeid(int);    std::cout << "tiInt.name = " << tiInt.name() << std::endl;
   
   
  • 1
  • 2

type_info有下列方法:

  • name(),返回类型的名字
  • hash_code(),返回这个类型的哈希值(具有唯一性)
  • before(),可以判断一个type_info对象的顺序是否在另一个之前(实现相关,同一个程序多次调用都可能不一样,不太理解有什么实际作用)
  • ==和!=操作符,判断两个type_info相等或不等

typeid操作符

typeid操作符在<typeinfo>中声明,用来在运行时获取类型、变量、表达式的类型信息,适用于C++基础类型、内置类、用户自定义类、模板类等。

它有两种形式:

  • typeid( 类型 )
  • typeid( 表达式 )

具体用法前面的示例代码已有了。

type_index

type_index类在头文件<typeindex>中声明,它是type_info对象的一个封装类,可以用作关联容器(比如map)和无序关联容器(比如unordered_map)的索引。

下面的代码(来自http://en.cppreference.com/w/cpp/types/type_index)使用type_index来输出一些类型信息(调试还是蛮有用的):

struct A {    virtual ~A() {}};struct B : A {};struct C : A {};int main(){    std::unordered_map<std::type_index, std::string> type_names;    type_names[std::type_index(typeid(int))] = "int";    type_names[std::type_index(typeid(double))] = "double";    type_names[std::type_index(typeid(A))] = "A";    type_names[std::type_index(typeid(B))] = "B";    type_names[std::type_index(typeid(C))] = "C";    int i;    double d;    A a;    // note that we're storing pointer to type A    std::unique_ptr<A> b(new B);    std::unique_ptr<A> c(new C);    std::cout << "i is " << type_names[std::type_index(typeid(i))] << '\n';    std::cout << "d is " << type_names[std::type_index(typeid(d))] << '\n';    std::cout << "a is " << type_names[std::type_index(typeid(a))] << '\n';    std::cout << "b is " << type_names[std::type_index(typeid(*b))] << '\n';    std::cout << "c is " << type_names[std::type_index(typeid(*c))] << '\n';}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/jfdfhh/article/details/87538285