2016-04-18 13 views
1

The CPPReference page on std::setbase sagt:Warum wechselt std :: setbase (2) nicht zur binären Ausgabe?

Werte von anderer Base als 8, 10 oder 16 zurückgesetzt FIELD auf Null, das Ausgangssignal und das Präfix abhängigen Eingang dezimal entspricht.

Wie kommt es?

Gibt es einen bestimmten Grund, warum nur diese Basen unterstützt werden? Es scheint trivial zu sein, zumindest etwas bis zu 16 zu unterstützen (eigentlich bis zu 36: 0-9 und dann a-z), ohne irgendwelche schwierigen Entscheidungen treffen zu müssen. Insbesondere ist 2 eine beliebte Basis, ich würde denken, dass Interesse in std::setbase(2) (und eine entsprechende std::binary) Interesse haben sollte.

Ich kann natürlich meine eigenen Bits drucken, aber es wäre schön für meine Ostream gewesen, es zu tun.

+1

die nette Weise, binäre zu drucken, ist http://en.cppreference.com/w/cpp/utility/bitset/operator_ltltgtgt2 – Cubbi

+0

@Cubbi: Das ist nett, aber es erfordert den Code, der zum Strom druckt, um bewusst zu sein die Notwendigkeit, in Binärform zu drucken. Ich möchte, dass _stream_ in binär konvertiert wird. – einpoklum

Antwort

1

Die einzige sichere Antwort ist "weil der Standard es so sagt".

aber sagen, dass der Standard meist die Vornorm Iostream Implementierungen formalisiert, von denen viele wahrscheinlich nur entworfen wurden Feature-Parität mit printf, die nur dezimal unterstützt zu erreichen, oktal und hexadezimal (durch ad-hoc, nicht-wirklich allgemeine Syntax).

Auch, wie es jetzt ist, wäre es nicht trivial, die Iostream-API zu patchen, um "viele" Basen zu unterstützen, vorausgesetzt, dass die Basiseinstellung in einem Bitfeld endet, nicht in einem separaten "aktuelle Basis" -Feld.

Nun verlangt der Standard fmtflags von einigen „bitmask Typ“ zu sein - was auch ein std::bitset sein kann, so dass man einen Weg finden, können alle diese neuen „Basis“ Felder irgendwie zu schaufeln - aber ist es wirklich die Mühe wert (plus das Risiko, den Code zu brechen, der annimmt, dass fmtflags von einem integralen Typ ist) für eine Eigenschaft, die fast niemand wirklich interessiert?

Also, um es zusammenzufassen: schlechtes anfängliches Design (wie der Rest von iostream, tatsächlich), nicht-triviale Korrektur und keine echte Benutzeranforderung für eine solche Funktion.