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

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

  • type_info类
  • typeid操作符
  • type_index类

type_info

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

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

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

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

type_info有下列方法:

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

typeid操作符

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

它有两种形式:

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

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

type_index

type_index类在头文件中声明,它是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 b(new B);
    std::unique_ptr 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';
}

你可能感兴趣的:(C/C++)