Ich habe eine Template-Klasse geschrieben, die ihren Template-Parameter offen legen sollte, aber ich bin nicht sicher, ob ich sie richtig benennen kann.
Ich habe drei verschiedene Namen für im Wesentlichen das gleiche gefunden (soweit ich das beurteilen kann):
std::vector
verwenden value_type
std::unique_ptr
use element_type
std::reference_wrapper
verwendet nur type
Was ist die Idee hinter diesen verschiedenen Namen? Welche Standardalgorithmen oder Traitklassen hängen von welchem Namen ab? Welchen Namen sollte ich für meine Klasse verwenden (etwas zwischen einem intelligenten Zeiger und einem Referenzwrapper)?
value_type
ist ein Membertyp von Containern (und Iteratoren usw.). Es stellt den Typ eines Objekts bereit, normalerweise ein vollständiges Objekt, das Sie erstellen oder beobachten können. Es gibt keine Umwandlung zwischen value_type
-CoVariant-Vorlagen.
element_type
ist ein Membertyp von Smartpointern. Es gibt den Typ eines beobachteten Objekts an. Smartpointer verwalten oft komplette Objekte, können aber auch in Basisobjekte umgewandelt werden.
type
ist ein Membertyp von Metafunktionen. Normalerweise beschreibt es kein bestimmtes Objekt.
value_type
ist Teil einer großen Familie von Dingen, die beim Definieren von Containern definiert werden müssen:
Diese werden zusätzlich zu den Iteratoren typedef
s von STL-Algorithmen verwendet, um mit Ihrem Container agnostisch umzugehen, ohne den Typ Ihres Containers zu kennen. Dies ist der Grund, warum der gleiche Algorithmus bei std::vector
, std::deque
und allen anderen STL-Containern funktioniert.
Andererseits haben std::unique_ptr
und std::reference_wrapper
ihre Typedefs der Vollständigkeit halber und um es dem Entwickler auch zu ermöglichen, Typen abzuleiten. Betrachten Sie zum Beispiel die Situation:
(PS: Natürlich können Sie auto
verwenden, aber das ist sogar vor C ++ 11 der Fall)
Sie sehen also, dass Sie immer einen Verweis auf den Typ im Container haben. Es spielt keine Rolle, ob es sich um einen STL-Container oder um std::unique_ptr
handelt. Es ist nur eine gute Übung, einen Verweis auf Ihren Vorlagentyp innerhalb Ihrer Vorlagenklasse zu haben, unabhängig davon, um was es sich handelt. Da STL und der C ++ - Standard auf Allgemeingültigkeit abzielen, finden Sie immer einen Verweis auf Ihre Vorlagentypen innerhalb der Klassen. Dadurch wird es einfacher für alles, was Sie tun, unabhängig von den Typen, die Sie in Ihre Vorlagen eingeben.
BEARBEITEN:
"Warum haben sie unterschiedliche Namen?" A: Einfach um Zweideutigkeiten zu vermeiden. Betrachten Sie einen Algorithmus, der einen Container aufnehmen soll und nur ein value_type
benötigt. Wenn die Namen unterschiedlich sind, fügen Sie zusätzlichen Schutz vor schwerwiegenden Laufzeitfehlern hinzu. Denken Sie daran, dass alles typenunabhängig wird. Das letzte, was wir wollen, ist eine weitere Fehlerquelle, indem wir alles value_type
nennen.