std::map mit std::type_info als Schlüssel, darf ich das so machen?
-
Guten Abend,
Ich brauche gerade eine Funktionalität, welche schon fast ein wenig in Richtung Reflection geht (nichts grossartiges, einfach mehr als pures RTTI), und wollte dazu eine
std::mapmitstd::type_infoals Schlüssel definieren.Damit das geht, brauche ich jedoch einen
operator<fürtype_info, welchen es nicht gibt. Stattdessen gibt es eine Funktionbefore:http://www.cplusplus.com/reference/std/typeinfo/type_info/ schrieb:
class type_info { public: virtual ~type_info(); bool operator== (const type_info& rhs) const; bool operator!= (const type_info& rhs) const; bool before (const type_info& rhs) const; const char* name() const; private: type_info (const type_info& rhs); type_info& operator= (const type_info& rhs); };Ich werde aus der Beschreibung nicht so recht schlau, es ist alles sehr schwammig formuliert. Verstanden habe ich, dass der Aufruf der Funktion
beforefür jeden Programmaufruf sogar andere Werte zurückgeben kann. Meine Frage ist, darf ich folgendes machen:class type_info_comparer { public: bool operator()(const std::type_info &a, const std::type_info &b) const { return a.before(b); } }; std::map<std::type_info, /* Insert very complicated type here... */, type_info_comparer> my_rtti_map;Das Verhalten muss unbedingt portabel sein.
$EDIT: Habe gerade daran herumgebastelt und festgestellt, dass ich sowieso ein Problem bekomme, da der
operator= privateist. Muss ich jetzt auch noch einen Wrapper schreiben?
-
Hier hast du eine fertige Implementierung:
http://loki-lib.sourceforge.net/html/a00657.htmlNach meinem Wissen ist sowas absolut erlaubt. Es ist nur nicht spezifiziert, wie die Reihenfolge festgelegt wird.
Grüssli
-
/rant/ schrieb:
$EDIT: Habe gerade daran herumgebastelt und festgestellt, dass ich sowieso ein Problem bekomme, da der
operator= privateist. Muss ich jetzt auch noch einen Wrapper schreiben?
Du kannst keine Objekte von
type_infoin Containern abspeichern, nur Zeiger aufconst. Oder du machst es komfortabel, indem du einen Wrapper mit Wertsemantik benutzt, siehe dazu Draveres Link.
-
Danke, habe jetzt einen Wrapper, mit welchem ich das so machen kann.
