Schreibt der Standard vor, dass ein Aufruf von std::type_index(typeid(obj))
für diesen Typ eindeutig ist? Ich konnte dazu keine Informationen finden. Von type_info::name()
habe ich folgendes bekommen:
Gibt eine implementierungsdefinierte nullterminierte Zeichenfolge zurück enthält den Namen des Typs. Keine Garantien sind gegeben, in Insbesondere kann die zurückgegebene Zeichenfolge für mehrere Typen identisch sein Wechsel zwischen den Aufrufen des gleichen Programms.
(Quelle: Ссылка )
Was mich zu der Annahme verleitet, dass die verstümmelten Namen / Typiden nicht sind. Die Seite für std::type_index
verwendet jedoch speziell die Annahme dieser Typen einzigartig in seinem " Anwendungsbeispiel ".
Wie kann ich also wissen, ob typeid
für meinen Compiler eindeutig ist und wie groß die Wahrscheinlichkeit für eine Kollision ist? Gibt es irgendeine Möglichkeit, eine Art von Bezeichner (ob String oder anders) zu erhalten, die wir kennen können?
Demangling ist keine Option, da es für sehr große Typen zu langsam ist, aber meine Vermutung ist, dass der mangled Name dafür eindeutig sein sollte, wenn die Implementierung die Möglichkeit bietet, einen Namen zu entmutigen Tippe diese Implementierung trotzdem ein, richtig?
Die Funktion name
auf einem type_info
wird nicht als nützlich angesehen. Eine Implementierung könnte wahrscheinlich ""
für alles zurückgeben und konform sein. In der Praxis ist es nicht immer ""
, und es kann zum Debuggen verwendet werden, aber nur das.
type_info
==
und before
und hash_code
verlassen sich jedoch nicht auf name
.
type_index
ist ein Wrapper um einen Zeiger auf ein type_info
, der die Methoden der Info verwendet, um einen regulären Typ zu erzeugen (kann kopiert, gespeichert usw. werden). Es ist für verschiedene Typen unterschiedlich.