一个简单运行时类型识别

namespace rtti_ex {

	/*
* 类型信息基类
*/
class i_type_info {
public:
// 判断是否是指定类型
bool is(const char* _name) const { return name() == _name; }
template<class T> bool is() const { return is(T::name()); } // 判断是否是派生类型
bool is_kind_of(const char* _name) const { return on_is_kind_of(_name); }
template<class T> bool is_kind_of() const { return is_kind_of(T::name()); } protected:
virtual bool on_is_kind_of(const char* name) const = 0;
virtual const std::string& name() const = 0;
}; /** 类型信息
* @_This 当前类
* @_Base 基类
* @_name_ 返回当前类名称的函数
*/
template<class _This, class _Base, const char*(*_name_)()>
class type_info : public _Base::type_info_t {
public:
type_info() : _name(_name_()) {} protected:
virtual bool on_is_kind_of(const char* name) const {
if (_name == name) {
return true;
}
return _Base::type_info_t::on_is_kind_of(name);
}
virtual const std::string& name() const { return _name; }; private:
const std::string _name;
}; /** 偏特化,最开始的基类类型(即没有继承的类)
*
*/
template<class _This, const char*(*_name_)()>
class type_info<_This, void, _name_> : public i_type_info{
public:
type_info() : _name(_name_()) {}
protected:
virtual bool on_is_kind_of(const char* name) const {
if (_name == name) {
return true;
}
return false;
}
virtual const std::string& name() const { return _name; };
private:
const std::string _name;
}; } #define REGIST_INFO_CLASS(ThisClass, BaseClass) \
public: \
static const char* name() { return #ThisClass; }\
typedef rtti_ex::type_info<ThisClass, BaseClass, name> type_info_t; \
virtual const rtti_ex::i_type_info& getinfo() { \
static type_info_t* s_info = nullptr; \
if (!s_info) { \
type_info_t* p = new type_info_t(); \
s_info = p; \
} \
return *s_info; \
}

测试:

class A {
REGIST_INFO_CLASS(A, void)
}; class B : public A {
REGIST_INFO_CLASS(B, A)
}; class C : public B{
REGIST_INFO_CLASS(C, B)
}; C c; A* a = &c;
bool b; b = a->getinfo().is<A>();
b = a->getinfo().is<B>();
b = a->getinfo().is<C>(); b = a->getinfo().is_kind_of<A>();
b = a->getinfo().is_kind_of<B>();
b = a->getinfo().is_kind_of<C>();

c++运行时类型识别(rtti)的更多相关文章

  1. C++学习之显式类型转换与运行时类型识别RTTI

    static_cast const_cast reinterpret_cast 运行时类型识别(RTTI) dynamic_cast 哪种情况下dynamic_cast和static_cast使用的情 ...

  2. C++之运行时类型识别RTTI

     C++ Code  12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...

  3. 运行时类型识别RTTI

    1.RTTI的工作原理 例1. 用Class加载对象示例. package RTTI; public class Candy { static{ System.out.println("Lo ...

  4. C++——运行时类型识别RTTI

    1.实现方式 typeid运算符,返回表达式的类型 dynamic_cast运算符,基类的指针或引用安全地转换成派生类的指针或引用 2.适用于:使用基类的指针或引用执行派生类的操作,且该操作不是虚函数 ...

  5. Java基础之RTTI 运行时类型识别

    运行时类型识别(RTTI, Run-Time Type Identification)是Java中非常有用的机制,在Java运行时,RTTI维护类的相关信息. 多态(polymorphism)是基于R ...

  6. RTTI 运行时类型识别 及异常处理

    RTTI   运行时类型识别 typeid  ------  dynamic_cast dynamic_cast 注意事项: 1.只能应用于指针和引用之间的转化 2.要转换的类型中必须包含虚函数 3. ...

  7. RTTI (Run-Time Type Identification,通过运行时类型识别) 转

    参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型.   RTTI提供了以下两个 ...

  8. MFC六大核心机制之二:运行时类型识别(RTTI)

    上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属 ...

  9. 框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解)

    框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解) 一丶什么是RTTI,以及RTTI怎么设计 通过第一讲,我们知道了怎么样升成一个窗口了,以及简单的消息循环. 第二讲则是主要讲解RTTI ...

随机推荐

  1. Java 集合 集合与数组之间的转换

    Java 集合 集合与数组之间的转换 @author ixenos 数组转集合 Arrays.asList(T... a) 先给结论:用 Arrays.asList(T... a) 将数组转换成集合 ...

  2. 如何理解CSS中的浮动 :其实他就像乘坐扶梯一样

    只要你用过自动扶梯,你就能很快的理解CSS中的浮动(Float). 你肯定遇到过这样的情况:       做好了,你想用CSS浮动来调整元素间的位置关系. 在写完代码之后,你发现浮动元素没出现在你设想 ...

  3. 搭建AVL树

    #include<iostream> using namespace std; struct TreeNode { int height; //每一个结点都要保存自己的高度 int dat ...

  4. Java的I/O总结

    概念:Java语言中数据流是接收和发送数据的管道.流是一位单项的. 流的分类: 按照字节字符:InputStream和OutputStream是字节输入输出流的抽象父类.Reader和Writer是字 ...

  5. Chapter 16_3 多重继承

    在Lua中进行面向对象编程时有几种方法,上一小结介绍了一种使用__index元方法的做法. 下面要介绍另一种方法,可以在Lua中实现多继承. 关键一点,在于用函数作为__index元字段. 多重继承意 ...

  6. jvm的可见性的理解

    同步包括两方面的含义: 独占性和可见性. 很多人仅仅理解了独占性,而忽略了可见性. 根据Java Language Specification中的说明, jvm系统中存在一个主内存(Main Memo ...

  7. POJ 2676 Sudoku(深搜)

    Sudoku Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total Submi ...

  8. Mac 必备软件 Quicksilver

    http://www.xdanger.com/2007/03/30/000067.html

  9. 关于oracle数据库(4)数据类型

    数据类型 字符数据类型char:固定长度字符串,最大可以存放2000字节 字符串varchar2:可变长度字符串,最大可以存放2GB数值类型数据 数字number:可以存放整数.浮点数.实数 numb ...

  10. MySQL Administrator的简单操作

    A.创建数据库 1.运行MySQL Administrator服务器,如下图. 2.点击"Catalogs",下面出现已有的数据库,右击已有的数据库,选择“Create New S ...