一个简单运行时类型识别

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>();

最新文章

  1. 百度Ueditor配置问题
  2. JavaScript中的数据类型转换
  3. 使用css打造形形色色的形状!
  4. java单例-积木系列
  5. Java多线程系列--“JUC原子类”01之 框架
  6. AndroidStudio第一个项目HelloWorld
  7. android DevicePolicyManager实现一键锁屏
  8. LVS的调度算法
  9. php基础26:文件与目录1
  10. C#获取cpu序列号 硬盘ID 网卡硬地址以及操作注册表 .
  11. 总结&amp;记录
  12. JS/JQ综合总结
  13. IOS--UIPageControl的使用方法详细
  14. MultiWii MWC的软件和调试方法
  15. Android之后台服务判断本应用Activity是否处于栈顶
  16. JAVA面向对象3---多态
  17. JS——实现短信验证码的倒计时功能(没有验证码,只有倒计时)
  18. linux CentOS 权限问题修复(chmod 777 -R 或者chmod 755 -R问题修复)
  19. Linux操作系统-命令-vmstat
  20. vb编程中的is是什么意思??

热门文章

  1. ggplot2 theme相关设置—矩形设置(rect)
  2. asp.net正则表达式去除a标签
  3. Infix expression 计算 without &#39;(&#39; and &#39;)&#39;
  4. 有关下行HARQ的一切
  5. Vultr免费vps注册和使用简易教程
  6. String,StringBuilder,StringBuffer
  7. Pots(BFS)
  8. java 判断大小写、数字出现的次数
  9. Confluence搭建
  10. docker network