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

Ich möchte eine Liste list<type_info>, um den Typ der Klassen zu speichern. Gibt es eine Lösung?So speichern Sie TypeInfo

+0

möglich Duplikat [Warum ist std :: type \ _info noncopyable? Darf ich es irgendwo speichern?] (Http://stackoverflow.com/questions/5330835/why-is-stdtype-info-noncopable-am-i-allowed-to-store-it-irgendwo) –

Antwort

4

Sie können Objekte der Klasse type_info nicht direkt instanziieren, da die Klasse nur einen Konstruktor für private Kopien aufweist. Da die Liste Kopie Konstruktor benötigt ...

Wenn Sie wirklich brauchen, verwenden Sie std :: list < type_info *>.

Ich weiß nicht, warum Sie diese Liste benötigen, aber ich würde nach Möglichkeit zu einem alternativen Design denken, nicht mit RTTI.

+0

eigentlich meine Absicht ist eine map zu erstellen. Gegeben eine Typinfo, die einen anderen Typ instanziiert. Beispielverwendung: Get (typeof (PageA)) gibt mir eine StyleA-Klasse –

+2

Dann sollten Sie wirklich etwas wie Klassen-IDs verwenden, die Sie selbst erstellen. –

+2

Wenn Sie wissen, dass Sie zur Kompilierungszeit mit PageA's arbeiten, sollten Sie einen Typedef in PageA einfügen. Beispiel: Klasse PageA { public: typedef StyleA style_t; // .... }; Wenn Sie dann den entsprechenden Style instanziieren möchten, tun Sie einfach: "PageA :: style_t mystyleinstance;". –

8

Sie können keine Kopien von 'type_info'-Objekten erstellen. Das Ergebnis, wenn 'typeid' ein L-Wert ist, und die entsprechenden 'type_info'-Objekte, die einmal erhalten wurden, bleiben jedoch bis zum Ende des Programms bestehen. Aus diesen Gründen können Sie Zeiger sicher auf 'type_info'-Objekte in Ihrer Liste speichern.

1

Von Ihrem Kommentar zu Cătălin Pitiş 'Antwort verstehe ich, dass Ihr Ziel ist, eine Funktion zu schreiben, die einen anderen "Style" -Typ für verschiedene "Page" -Typen zurückgibt. Muss das dynamisch sein? Wenn nicht, würde so etwas tun, was Sie wollen?

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(); 
} 

Oder mit Boost.MPL:

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

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

gibt es die Style-Typ vom Seitentyp ist:

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