2013-10-05 66 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的類型在編譯時TYPEID:

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* b指向具有相同派生類型的對象,如typeid(*a) == typeid(*b)

+0

這將工作,但這是運行時類型標識,並且編譯時生成的常量就足夠了。 – jms

+0

當然是。所有'typeid'信息都是編譯器在編譯程序時生成的。如果你的意思是「編譯時生成的」,你需要準確解釋你的需求是什麼。 –

+0

使用typeid()而不是硬編碼的幻數會有性能損失嗎?我意識到這是過早的優化,只是問。 – jms