typeid



  • Ich möchte den Typ eines Objectes als Key in meiner Map verwenden und habe mir daher typeid angeschaut

    class A {
    
    };
    
    int main() {
    
    A a;
    
    std::cout << typeid(a).name() << std::endl;
    
    }
    

    liefert mir allerdings eine Zahl vor dem A in der Ausgabe.

    Woran liegt das? und Wie wäre das beste Vorgehen um den Typen eines Objects mittels eines string als key in einer map zu verwenden?



  • Sewing schrieb:

    liefert mir allerdings eine Zahl vor dem A in der Ausgabe.

    Und warum ist das ein Problem?



  • weil ich mich darauf verlasen können möchte, dass name() den Klassennamen liefert.

    Und was besagt dieser Integer?



  • Das ist ein gemangelter Name. Lass die Ausgabe danach noch durch c++filt laufen.

    Beispiel:

    echo i 1A P1A | c++filt -t
    int A A*
    

    Und ansonsten lies Howard Hinnants Antwort hier:
    https://stackoverflow.com/questions/81870/is-it-possible-to-print-a-variables-type-in-standard-c

    Wobei die eigentliche Frage aber wäre: warum brauchst du das überhaupt, was ist dein genauer Usecase?



  • Lies dir mal die Doku zu std::type_info::name durch, besonders "Notes".

    Und für die Map brauchst du nicht unbedingt einen string:

    map<type_info, X>
    

    Edit: wenn man den operator < z.B. mittels type_info::before implementiert.


  • Mod

    Sewing schrieb:

    Ich möchte den Typ eines Objectes als Key in meiner Map verwenden und habe mir daher typeid angeschaut

    Was genau ist die Motivation für diese Herangehensweise? Zweitens solltest du wissen, dass der gar vollständig qualifizierte Name einer Klasse nicht ausreichend ist, um zwei individuelle Klassen zu unterscheiden. Weil beide bspw. interne linkage haben könnten, oder lokale Klassen innerhalb von Funktionen oder Lambdas (und es wäre diffizil, die volle "Qualifizierung" entsprechend zu erweitern). Was du brauchst, ist der Hash. In diesem Zusammenhang ist std::type_index zu erwähnen, ein für assoziative Container konzipierter Wrapper von type_info . Aber wie gesagt, ich verstehe die Anwendung nicht, das hört sich nach einem Einsatz dynamischer Polymorphie an, wo statische angebracht wäre.



  • die Anwendung ist eine std::map in der ich mittels eines keys, der eben der jeweilige Objecttyp ist, auf einen mapped_type, dh. pointer auf einen polymorphen zugreifen möchte.

    edit: genau gesagt geht es um das type erasure idiom

    Ich knalle mehrere verschiedene objecte in mein type Erasure object, wo sie in einer map gesammelt werden.

    Danach will ich in der lage sein, auf einzelne Einträge in dieser Map zuzugreifen


  • Mod

    Sewing schrieb:

    die Anwendung ist eine std::map in der ich mittels eines keys, der eben der jeweilige Objecttyp ist, auf einen mapped_type, dh. pointer auf einen polymorphen zugreifen möchte.

    Das ist nicht das Problem, sondern die Lösung.



  • #include <iostream>
    #include <map>
    #include <memory>
    #include <typeindex>
    #include <typeinfo>
    #include <vector>
    
    class TypeErasure
    {
     public:
        template <typename T>  
        void equipWith(T &&arg) { // universal reference
            lists_[std::type_index(typeid(T))] =
                std::make_shared<Model<T>>(std::forward<T>(arg));
        }
    
     private: // nested private interface
        struct Concept
        {
            virtual ~Concept() = default;
        };
    
        template <typename T>
        struct Model : Concept
        {
            Model(T arg) : object_(std::move(arg)) {}
    
            T object_;
        };
    
        std::map<std::type_index, std::shared_ptr<const Concept>> lists_;
    };
    
    struct A
    {
    
    };
    
    struct B
    {
    
    };
    
    int main() {
        Type Erasure type;
        type.equipWith(A{});
    
        type.get("A");
    }
    

    Irgendwie so. Ich möchte also mittels irgendeiner function auf bestimmte Einträge in der Map zugreifen können und weiß momentan nicht, wie ich das elegant lösen kann


Anmelden zum Antworten