实现简易的C++ RTTI

#include <iostream>
#include <string>

class Type {
public:
	Type(const std::string& type, const Type* baseType)
		: m_typeName(type)
		, m_baseType(baseType)
	{}
	std::string typeName() const { return m_typeName; }
	const Type* baseType() const { return m_baseType; }
private:
	const Type* m_baseType;
	std::string m_typeName;
};

class Object {
public:
	template<typename T>
	static T* cast(Object* obj) {
		if (obj == nullptr) {
			return nullptr;
		}
		const Type* t = obj->type();
		do {
			std::cout << t->typeName() << std::endl;
			if (t == T::m_type) {
				return (T*)obj;
			}
		} while (t = t->baseType());
		return nullptr;
	}
protected:
	virtual const Type* type() { return m_type; }
	inline static const Type* m_type = new Type("Object", nullptr);
};

#define OBJECT(Derive, Base) \
protected: \
friend class Object; \
virtual const Type* type() { return m_type; } \
inline static const Type* m_type = new Type(#Derive, Base::m_type);

template <typename T>
T* object_cast(Object* obj) {
	return Object::cast<T>(obj);
}

class A : public Object
{
	OBJECT(A, Object)
public:
	A() {}
};

class B : public A
{
	OBJECT(B, A)
public:
	B() {}
};

class C : public B
{
	OBJECT(C, B)
public:
	C() {}
};

class D : public C
{
	OBJECT(D, C)
public:
	D() {}
};

int main()
{
	Object* o = new C();
	A* a = object_cast<A>(o);
	B* b = object_cast<B>(o);
	C* c = object_cast<C>(o);
	D* d = object_cast<D>(o);
	std::cout << (a == nullptr ? "false" : "true") << std::endl;
	std::cout << (b == nullptr ? "false" : "true") << std::endl;
	std::cout << (c == nullptr ? "false" : "true") << std::endl;
	std::cout << (d == nullptr ? "false" : "true") << std::endl;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值