Der arithmetische Extraktionsoperator für std::basic_istream
hat nicht virtuelle Überladungen für alle 8 Integer-Typen (es werden keine Zeichen aufgelistet, die sowieso anders behandelt werden), und es ruft num_get::get
auf, das individuelle
Der arithmetische Insertionsoperator für std::basic_ostream
hat auch nicht-virtuelle Überladungen für alle 8 Integer-Typen , und es ruft num_put::put
auf, das nur virtuelle Überladungen für 4 Typen aufweist sind long
, long long
und ihre unsignierten Varianten. Bei den kleineren Typen führt der Einfügeoperator Ganzzahlpromotionen durch.
Warum eine Lücke in der sonst üblichen Tour-De-force der Benutzererweiterbarkeit? Es scheint unmöglich zu sein, eine benutzerdefinierte Handhabung für jeden Integer-Typ bereitzustellen (z. B. um eine typerhaltende Serialisierungsbibliothek über der Iostream-Schnittstelle aufzubauen), und außerdem ist sie asymmetrisch. Es hätte mit wenig Aufwand erreicht werden können. Gibt es einen Kompromiss?
Nach Standard C ++ Iostreams und Locales :
Auf den ersten Blick könnte es so aussehen, als ob Versionen von put () kurz, int, oder float fehlen. Die Absicht war, die Schnittstelle der Standard Library Concise, und ein Wert des Typs short oder int kann sein gehandhabt durch die Version von lang. Ähnlich kann ein Wert vom Typ float sein mit der put () - Version von double behandelt werden.
und dann später über num_get::get()
:
Wieder, wie bei num_put :: put (), die Typen, die nicht absolut sind notwendig sind weggelassen.
Wenn Sie Werte lesen, müssen Sie Überläufe zulassen, daher brauchen Sie für jeden Typ einen Extraktor. Wenn Sie Werte schreiben, tun Sie dies nicht, daher ist der größte Typ ausreichend. Früher war der größte Typ long
. Wenn long long
hinzugefügt wurde, wurde die Version für long
aus Gründen der Abwärtskompatibilität beibehalten.