class A {}
A a;
type_info info = typeid (a); // error type_info is private
我想要一個列表list<type_info>
來存儲類的類型。有解決方案嗎?如何存儲類型信息
class A {}
A a;
type_info info = typeid (a); // error type_info is private
我想要一個列表list<type_info>
來存儲類的類型。有解決方案嗎?如何存儲類型信息
您不能直接實例化type_info類的對象,因爲該類只有一個私有拷貝構造函數。由於列表需要複製構造函數...
如果您真的需要它,請使用std :: list < type_info *>。
我不知道你爲什麼需要這個列表,但我會考慮一個替代設計,如果可能,不涉及RTTI。
其實我的意圖是製作一張地圖
然後,你應該真的使用類似於你自己創建的class ID。 – 2009-10-16 13:19:54
如果您知道您在編譯時處理PageA,您應該在PageA中放入一個typedef。例如: class PageA { public: typedef StyleA style_t; // ... }; 然後當你想實例化適當的風格時,你只需要:「PageA :: style_t mystyleinstance;」。 – 2009-10-16 14:01:40
您不能創建'type_info'對象的副本。但是,如果'typeid'是一個左值並且相應的'type_info'對象一旦獲得,那麼結果會一直持續到程序結束。由於這些原因,您可以安全地將指針存儲到列表中的'type_info'對象。
從您的評論到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;
的[可能重複爲什麼的std ::類型\ _info不可複製?我是否允許將它存儲在某處?](http://stackoverflow.com/questions/5330835/why-is-stdtype-info-noncopyable-am--allowed-to-store-it-somewhere) – 2015-06-22 22:01:53