2013-04-09 5 views
8

Der arithmetische Eingabe-Operator für std::basic_istream hat non-virtual overloads for all 8 integer types (nicht Listing Zeichen, die unterschiedlich ohnehin behandelt werden), und es ruft num_get::get, die einzelnen virtual overloads for 6 of them (fehlende signierte Versionen von kurzem und int) für std::basic_ostreamWarum sind num_get und num_put asymmetrisch?

Der Arithmetik-Operator hat hat auch non-virtual overloads for all 8 integer types, und es ruft num_put::put, die nur virtual overloads for 4 types, die long, long long und ihre unsignierten Varianten sind. Bei den kleineren Typen führt der Einfügeoperator ganzzahlige Aktionen durch.

Warum eine Lücke in was sonst eine 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?

Antwort

4

Nach Standard C++ Iostreams and Locales:

Auf den ersten Blick könnte es so aussehen, als ob Versionen von put() für kurze, int, oder Schwimmer fehlen. Die Absicht war, die Schnittstelle der Standardbibliothek kurz zu halten, und ein Wert vom Typ short oder int kann von der Version long behandelt werden. Ähnlich kann ein Wert des Typs float von der put() - Version von double behandelt werden.

und dann später über num_get::get():

Wieder, wie mit num_put :: put(), die Typen, die nicht unbedingt notwendig sind, weggelassen.

+0

Aber die Absicht der Frage war zu fragen, warum Modularität gegen - z. benutzerdefiniertes num_put und num_get, das binäre E/A mit den formatierten Eingabe-/Ausgabeoperatoren erlaubte. –

+0

@ LB--: Ich glaube, das ist in beiden Antworten ausreichend erklärt. Was hast du vermisst? –

+0

Ich sehe nicht, wie die Begründung gilt, wenn man Typinformation in 'num_put' erhalten will, wie für die binäre Ausgabe. –

4

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.

Verwandte Themen