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::map mit std::type_info als Schlüssel definieren.

    Damit das geht, brauche ich jedoch einen operator< für type_info , welchen es nicht gibt. Stattdessen gibt es eine Funktion before :

    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 before fü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= private ist. Muss ich jetzt auch noch einen Wrapper schreiben? 😮


  • Administrator

    Hier hast du eine fertige Implementierung:
    http://loki-lib.sourceforge.net/html/a00657.html

    Nach 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= private ist. Muss ich jetzt auch noch einen Wrapper schreiben? 😮

    Du kannst keine Objekte von type_info in Containern abspeichern, nur Zeiger auf const . 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.

    👍


Log in to reply