我正在編寫一個事件系統作爲一個愛好項目,一個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...
對不起,我很困惑你在編譯時需要做什麼 – aaronman
當前我正在傳遞一個整數給每個派生類對象的構造函數,表示派生類的類型。我希望自動生成該ID。 – jms
好吧,你有點困惑我,因爲有一個名爲'typeid'的內置東西,你不應該給內置的東西使用相同的名字 – aaronman