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