2013-04-09 15 views
8

Arytmetyka operator ekstrakcji std::basic_istream ma non-virtual overloads for all 8 integer types (nie zawierające wykaz znaków, które są obsługiwane w różny sposób w każdym razie), a to wywołuje num_get::get, który posiada indywidualne virtual overloads for 6 of them (brakujące podpisane wersje krótkie i int)Dlaczego num_get i num_put są asymetryczne?

Arytmetyka operator wstawiania dla std::basic_ostream ma także non-virtual overloads for all 8 integer types i wywołuje num_put::put, który ma tylko virtual overloads for 4 types, które są long, long long i ich niepodpisane warianty. W przypadku mniejszych typów operator wstawiania wykonuje liczby całkowite.

Dlaczego luka w tym, co jest poza tym, jest siłą napędową rozszerzalności użytkownika? Wydaje się niemożliwe, aby zapewnić obsługę zdefiniowaną przez użytkownika dla każdego typu liczb całkowitych (np. W celu zbudowania biblioteki serializacji zachowującej typ na szczycie interfejsu iostream), a moreso - jest asymetryczny. Mogło to zostać osiągnięte przy niewielkim wysiłku. Czy istnieje kompromis?

Odpowiedz

4

Według Standard C++ Iostreams and Locales:

Na pierwszy rzut oka może to wyglądać tak, jakby wersje put() na krótkie, int, lub pływak brakuje. Założono, że interfejs biblioteki standardowej będzie zwięzły, a wartość typu short lub int może być obsługiwana przez wersję long. Podobnie, wartość typu float może być obsługiwana przez wersję put() double.

i później o num_get::get():

Ponownie, jak w przypadku num_put :: umieścić(), rodzaje, które nie są całkowicie potrzeby pominięte.

+0

Ale celem tego pytania było pytanie, dlaczego modularność została podjęta - np. custom num_put i num_get, które umożliwiły binarne operacje we/wy za pomocą sformatowanych operatorów wejścia/wyjścia. –

+0

@ LB--: Uważam, że jest wystarczająco wyjaśnione w obu odpowiedziach. Czego przegapiłeś? –

+0

Nie widzę, w jaki sposób uzasadnienie ma zastosowanie, gdy chce się zachować informacje o typie w wyrażeniu "num_put", na przykład dla wyjścia binarnego. –

4

Kiedy czytasz wartości, musisz pozwolić na przepełnienia, więc potrzebujesz ekstraktora dla każdego typu. Kiedy piszesz wartości, nie, więc największy typ jest wystarczający. Powrót w dawnych czasach największy typ był long. Po dodaniu long long wersja dla long została zachowana ze względu na zgodność wsteczną.