一个简单运行时类型识别

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. hdu_5950_Recursive sequence(矩阵快速幂)

    题目链接:hdu_5950_Recursive sequence 题意:递推求解:F(n) = 2*F(n-2) + F(n-1) + n4 和F(1) = a,F(2) = b: 题解: 一看数据范 ...

  2. Mysql表名区分大小写

    mysql数据库在windows服务器上表名和字段名均不区分大小写, 但在linux服务器上表名默认是区分大小写的,可在/etc/my.cnf文件中的[mysqld]下面加上一条配置 lower_ca ...

  3. 二维小波包分解wpdec2

    load woman; %小波包2尺度(层)分解 t=wpdec2(X,2,'haar'); plot(t);%绘制小波包树 %提取(1,2)处结点.也可以点击上图结点,观察 c12=wpcoef(t ...

  4. JSP中的EL语言

    1,EL(Expression Language)是从JavaScript得到启发的一种表达式语言, 2,EL表达式包含文字,操作符,变量,函数调用: 3,EL 存取变量的语法格式:${ userna ...

  5. FZU 1894 志愿者选拔 单调队列

    训练赛的题…… 暴力一波明显超时…… 最近刚学stl 感觉是优先队列 但还是太会用…… 以后可以试一下优先队列…… 比赛之后百度了一下 发现是单调队列…… 看起来挺简单的 也算个模版题吧…… 总之思路 ...

  6. 抛弃阿里云,中国用户购买海外VPS的五个理由

    王掌柜在过去的五年多时间里,折腾过不少vps品牌,最开始玩的是一年一百多块钱的香港虚拟主机,后来业务量大了,开始折腾国内的小鸟云.阿里云.腾讯云.电信云.百度云主机,国外的linode\interse ...

  7. 亲身体验:digitalocean vps能做的10件事

    我写过一篇亲身体验:digitalocean和linode评测哪个好,帮助不少网友选购价格便宜性能优异的免备案vps,相信大家对两家产品有所了解.vps的性能和用途远远超过传统的虚拟主机,你拥有独立I ...

  8. Quartz(任务调度)- 入门学习

    参照:http://blog.csdn.net/szwangdf/article/details/6158646 1.自定义定时任务管理类 QuartzManager 参照大神基础上新增:1.添加jo ...

  9. dom入门

    当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). //显示,改变html内容 document.getElementById("p1" ...

  10. cookie的简单应用

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...