2009-10-16 98 views
5
class A {} 
    A a; 
    type_info info = typeid (a); // error type_info is private 

我想要一個列表list<type_info>來存儲類的類型。有解決方案嗎?如何存儲類型信息

+0

的[可能重複爲什麼的std ::類型\ _info不可複製?我是否允許將它存儲在某處?](http://stackoverflow.com/questions/5330835/why-is-stdtype-in​​fo-noncopyable-am--allowed-to-store-it-somewhere) – 2015-06-22 22:01:53

回答

4

您不能直接實例化type_info類的對象,因爲該類只有一個私有拷貝構造函數。由於列表需要複製構造函數...

如果您真的需要它,請使用std :: list < type_info *>。

我不知道你爲什麼需要這個列表,但我會考慮一個替代設計,如果可能,不涉及RTTI。

+0

其實我的意圖是製作一張地圖。給定一個typeinfo實例化另一個類型。 範例用法: Get(typeof(PageA))給了我一個StyleA類 – 2009-10-16 13:17:28

+2

然後,你應該真的使用類似於你自己創建的class ID。 – 2009-10-16 13:19:54

+2

如果您知道您在編譯時處理PageA,您應該在PageA中放入一個typedef。例如: class PageA { public: typedef StyleA style_t; // ... }; 然後當你想實例化適當的風格時,你只需要:「PageA :: style_t mystyleinstance;」。 – 2009-10-16 14:01:40

8

您不能創建'type_info'對象的副本。但是,如果'typeid'是一個左值並且相應的'type_info'對象一旦獲得,那麼結果會一直持續到程序結束。由於這些原因,您可以安全地將指針存儲到列表中的'type_info'對象。

1

從您的評論到CătălinPitiş的回答,我明白你的目標是編寫一個函數,爲不同的「Page」類型返回不同的「Style」類型。這是否必須是動態的?如果沒有,這樣的事情會做你想做的事情嗎?

template<class PageT> 
struct StyleOf; 

template<> 
struct StyleOf<PageA>{ 
    typedef StyleA type; 
}; 

template<> 
struct StyleOf<PageB>{ 
    typedef StyleB type; 
}; 

// etc... 

template<class PageT> 
typename StyleOf<PageT>::type 
GetStyle(const PageT&){ 
    return StyleOf<PageT>::type(); 
} 

或者與Boost.MPL

using boost::mpl::map; 
using boost::mpl::pair; 

typedef map< 
    pair<PageA, StyleA>, 
    pair<PageB, StyleB>, 
    //etc. 
> 
PageToStyle; 

獲取樣式類型從頁面類型:

boost::mpl::at<PageToStyle, Page>::type;