GPG 5권에 나오는 내용으로 런타임 상에서 해당 오브젝트의 타입 정보를 알아낼수 있는 기능입니다.

제가 사용한 용도로는 객체 리스트를 들고 있는데, 이 객체들이 하나는 로직컬 객체고 다른 하나는 렌더러블 객체라 할 때, 이 둘을 분류 하기 위해서 어느 방법이 좋을까 고심하다 (물론 다른 방법도 많겠지만 ) RTTI를 적용해보기로 했습니다.

제가 사용하는 대략적인 소스 코드입니다.


CRTTI.h
class CRTTI
{
public:
	CRTTI( const tstring strClassName, const CRTTI* pBaseRTTI );
	inline const tstring& GetClassName() const;
	inline const CRTTI* GetBaseRTTI() const;

protected:
	const tstring	m_strClassName;
	const CRTTI*	m_pBaseRTTI;
};


CObject.h
class CObject
{
public:
	CObject();;
	virtual ~CObject();

public:
	virtual const CRTTI* GetRTTI() const;

public:
	static bool IsClassOf( const CRTTI* pRTTI, const CObject* pObject );
	bool IsClassOf( const CRTTI* pRTTI ) const;
	static bool IsKindOf( const CRTTI* pRTTI, const CObject* pObject );
	bool IsKindOf( const CRTTI* pRTTI ) const;

public:
	static const ev_CRTTI			ms_RTTI;
	const boost::flyweight	m_strClassName;
	
};

CRTTI 정적 멤버 변수로 클래스 타입 고유의 ID 역할을 합니다. 이 멤버 변수가 같다면, 같은 클래스 타입이라 할 수 있습니다.  IsClassOf 함수에서는 해당 객체가 해당 클래스인지 판별을 하고, IsKindOf 함수에서는 해당 객체의 부모 클래스 타입을 검색해 어느 클래스로 부터 파생 되었는 지를 판별할 수 있습니다.

+ Recent posts