2011-06-20 59 views
2

我試圖創建一個可以附加到我的對象的可用元數據的容器。我可以保證在我的課程中最多隻能有一個對象,但是不能附加不同類型的對象。例如,我無法將wordInfo的兩個實例附加到對象,但可以同時將wordInfophraseInfo類的實例附加到對象。這是我迄今爲止完成的工作。如何創建一個容器,每個對象都有一個對象?

class object 
{ 
    std::map <std::type_info, object*> mMetaData; 
    public: 
    inline void attachMetaData(object* pData) 
    { 
     mMetaData[typeid(*pData)] = pData; 
    } 
    template <class T> inline std::enableif<std::is_base_of<object,T>::value, T*>::type getMetaData() 
    { 
     if (mMetaData.find(typeid(T)) == mMetaData.end()) 
      return NULL; 
     else 
      return mMetaData[typeid(T)]; 
    } 
    template <class T> inline std::enableif<std::is_base_of<object,T>::value, void>::type detachMetaData() 
    { 
     mMetaData.erase(typeid(T)); 
    } 
} 

上面的代碼有一個編譯錯誤:少操作者沒有爲std::type_info定義,因此我定義一些不太類專門爲std::type_info,並將其傳遞作爲這樣地圖類的第三模板參數:

struct typeinfoless 
{ 
    bool operator()(std::type_info& left, std::type_info& right) 
    { 
     return left.hash() < right.hash(); 
    } 
} 
std::map <std::type_info, object*, typeinfoless> mMetaData; 

但後來我遇到了另一個我不知道如何解決的錯誤,std::type_info有私有構造函數,甚至私有拷貝構造函數,所以我甚至不能從它派生出一些類。任何想法如何解決這個問題?或任何其他可能的方式來創建我的object類?

+0

可能的[OneOfAType容器的重複 - 在容器中存儲一個給定類型的每一個 - 我在這裏基地嗎?](http://stackoverflow.com/questions/3221501/oneofatype-container-storing-one每一個給定類型在一個容器,我 - io) – Cubbi

+0

也,討論http://stackoverflow.com/questions/3552135/will-c0x-provide-hashing-functions-for -stdtype-in​​fo可能更加合適 – Cubbi

+1

@cubbi:似乎不是,我已經得到了散列函數,這是你標記的那個主要問題。我不確定是VC++實現還是其他類型的函數,但我可以很容易地使用它,我的問題是創建一個map類作爲鍵,因爲我得到了一個錯誤type_info :: type_info無法訪問。 – Ali1S232

回答

3

創建的std :: TYPE_INFO一個包裝類,類似以下內容:

class TypeWrapper 
{ 
    private const std::type_info &mInfo; 
    public TypeWrapper(const std::type_info &info) : mInfo(info) 
    { 
    } 
    // Functions required by a key into a std::map. 
}; 

使用TypeWrapper爲您的鑰匙到您的地圖。

+0

似乎typeid的返回值不是'std :: type_info',而不是'std :: type_info&'。所以我不能調用'TypeWrapper(typeid(int))' – Ali1S232

5

回答古代問題的道歉,但這是谷歌,當我試圖找出它的第一個結果。而不是創建一個包裝類,你應該使用std::type_index包裝類作爲你的地圖的關鍵。

相關問題