Was ist der Unterschied zwischen Typ, Werttyp und Elementtyp und wann jeweils zu verwenden?

8

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):

  • Container, z. B. std::vector verwenden value_type
  • intelligente Zeiger, z. B. 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)?

    
zennehoy 28.03.2017, 07:59
quelle

2 Antworten

5

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.

    
Potatoswatter 28.03.2017, 08:27
quelle
3

value_type ist Teil einer großen Familie von Dingen, die beim Definieren von Containern definiert werden müssen:

%Vor%

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:

%Vor%

(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.

    
The Quantum Physicist 28.03.2017 08:20
quelle

Tags und Links