2013-10-05 4 views
0

취미 프로젝트 인 2D 게임 엔진의 일부로 이벤트 시스템을 작성하고 있습니다. 이벤트 시스템 디자인의 일환으로, 템플릿 기반 파생 클래스를 기반으로 객체를 매핑해야합니다. 더 나은 문제를 설명하기 위해 다음과 같은 간단한 코드를 살펴컴파일 시간 생성 된 상수 유형 ID

class Base 
{ 
public: 
    virtual ~Base(){}; 
    int getTypeId() {return typeId_;} 
    static bool compareIfSameType(Base *a, Base *b) 
     {return a->getTypeId() == b->getTypeId();} 
protected: 
    int typeId_; 
}; 

template<typename T> 
class Derived : public Base 
{ 
public: 
    Derived(int typeId) {typeId_ = typeId;} 
}; 

int main() 
{ 
    Derived<int> obj1(1); 
    Derived<float> obj2(2); 
    Derived<float> obj3(2); 

    if(Base::compareIfSameType(&obj1, &obj2)) 
     cout << "obj1 and obj2 are of equal type\n"; 
    else cout << "obj1 and obj2 are not of equal type\n"; 
    if(Base::compareIfSameType(&obj2, &obj3)) 
     cout << "obj2 and obj3 are of equal type\n"; 
    else cout << "obj2 and obj3 are not of equal type\n"; 
} 
/*output: 
obj1 and obj2 are not of equal type 
obj2 and obj3 are of equal type*/ 

가이 코드에 실제 문제가 없지만, 수동으로 각 파생 클래스 인스턴스의 유형을 식별하는 번호를 전달하는 요구 사항은 매우 복잡하고 매우 오류입니다 경향이있다. 는 내가 원하는 것은 자동으로 컴파일시에 T 유형에서 유형 ID를 생성하는 것입니다

Derived<int> obj1; 
Derived<float> obj2; 
Derived<float> obj3; 

if(Base::compareIfSameType(&obj1, &obj2)) 
    //do something... 
+0

죄송합니다. 정확히 – aaronman

+0

컴파일 시간에 달성해야 할 일이 무엇인지 혼란 스럽습니다. 현재 파생 클래스의 유형을 나타내는 각 파생 클래스 객체의 생성자에 정수를 전달하고 있습니다. 그 ID가 자동으로 생성되도록하고 싶습니다. – jms

+0

좋아,'typeid'라는 것이 내장되어 있기 때문에 조금 혼란 스러웠다. 내장 된 것과 같은 이름을주지 말아야한다. – aaronman

답변

1

평등에 대한 유형을 비교 요구하는 디자인의 지혜의 질문을 제쳐 퍼팅을, 당신은 typeid으로 그렇게 할 수 있습니다. 나 자신을 쓸 필요가 없습니다. Base* aBase* btypeid(*a) == typeid(*b) 인 경우 동일한 파생 형식을 가진 개체를 가리 킵니다.

+0

그게 작동하지만 런타임 형식 식별 및 컴파일 타임 상수 생성 충분합니다. – jms

+0

예. 모든'typeid' 정보는 프로그램을 컴파일 할 때 컴파일러에 의해 생성됩니다. "컴파일 타임 생성"으로 다른 것을 의미하는 경우 요구 사항이 무엇인지 정확하게 설명해야합니다. –

+0

하드 코드 된 매직 번호 대신에 typeid()를 사용하면 성능이 저하됩니까? 나는 이것이 조숙 한 최적화라는 것을 깨닫는다. 단지 묻는다. – jms