C++11 | 运行时类型识别(RTTI)
2016-06-02 17:49
417 查看
C++11里的RTTI更好用了,参见这里:http://en.cppreference.com/w/cpp/types。与RTTI相关的有几个类和方法:
type_info类
typeid操作符
type_index类
type_info是实现相关的,不同编译工具链的实现可能不一致。
下面的代码可以打印出int类型的名字:
type_info有下列方法:
name(),返回类型的名字
hash_code(),返回这个类型的哈希值(具有唯一性)
before(),可以判断一个type_info对象的顺序是否在另一个之前(实现相关,同一个程序多次调用都可能不一样,不太理解有什么实际作用)
==和!=操作符,判断两个type_info相等或不等
它有两种形式:
typeid( 类型 )
typeid( 表达式 )
具体用法前面的示例代码已有了。
下面的代码(来自http://en.cppreference.com/w/cpp/types/type_index)使用type_index来输出一些类型信息(调试还是蛮有用的):
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;
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'; }
相关文章推荐
- 李洪强-C语言5-函数
- c++学习课时二 简单的判断&&循环
- 第十三周【项目3-形状类族的中的纯虚函数】
- Eclipse运行C++问题Launch failed,Binary not found
- 详解Windows下Eclipse CDT 配置C-C++ 编译环境
- C++中ifstream使用笔记(二)(gdb调试案例BUG)
- 【C++】StreamString清空用法
- leetcode 160 Intersection of Two Linked Lists C++
- C++ STL--stack/queue 的使用方法
- 设计模式之建造者模式(C++实现)
- 【C语言】10-字符和字符串常用处理函数
- 使用VC++6.0 MFC OLE操作Excel 进行简单的读写
- C++ 常用的字符串处理函数实现
- 分数类中的运算符重载
- 分数类中的运算符重载
- 分数类中的运算符重载
- 分数类中的运算符重载
- 分数类中的运算符重载
- C++ STL栈容器以及 .front()函数
- C++实践参考:洗牌(范型程序设计)