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-cWobei 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.
-
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 vontype_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
-
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