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
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
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.
eigentlich meine Absicht ist eine map
Dann sollten Sie wirklich etwas wie Klassen-IDs verwenden, die Sie selbst erstellen. –
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;". –
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.
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;
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) –