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