На этом шаге мы приведем более подробные определения классов.
Как и все шаблонные классы библиотеки IOStream, шаблон basic_ios<> параметризуется по двум аргументам, а его определение выглядит так:
namespace std { template <class charT, class traits = char_traits<charT> > class basic_ios; }
В аргументах шаблона передается тип символов, используемый потоковыми классами, и класс с описанием трактовок этого типа.
В частности, трактовки класса определяют признак конца файла и способы копирования/перемещения ряда символов.
Как правило, тип символов ассоциируется с определенным набором трактовок, поэтому будет вполне логично определить шаблонный класс, специализируемый для конкретных типов символов.
Соответственно по умолчанию используется класс трактовок char_traits<charT>, где charT - тип символов. Стандартная библиотека C++ содержит специализации шаблона char_traits для типов символов char и wchar_t.
Существуют две специализации класса basic_ios<> для двух самых распространенных типов символов:
namespace std { typedef basic_ios<char> ios; typedef basic_ios<wchar_t> wios; }
Тип ios соответствует базовому классу "старой" библиотеки IOStream, разработанной AT&T, и может использоваться для обеспечения совместимости со старыми программами C++.
Класс потокового буфера, используемый basic_ios, определяется аналогично:
namespace std { template <class charT, class traits = char_traits<charT> > class basic_streambuf; typedef basic streambuf<char> streambuf; typedef basic_streambuf<wchar_t> wstreambuf; }
Конечно, шаблоны basic_istream<>, basic_ostream<> и basic_iostream<> тоже параметризуются по типу символов и классу трактовок:
namespace std { template <class charT, class traits = char_traits<charT> > class basic_istream; template <class charT, class traits = char_traits<charT> > class basic_ostream; template <class charT, class traits = char_traits<charT> > class basic_iostream; }
По аналогии с другими классами также существуют специализации для двух важнейший типов символов:
namespace std { typedef basic_istream<char> istream; typedef basic_istream<wchar_t> wistream; typedef basic_istream<char> ostream; typedef basic_istream<wchar_t> wostream; typedef basic_istream<char> iostream; typedef basic_istream<wchar_t> wiostream; }
В западном полушарии обычно используются типы istream и ostream, в целом совместимые со "старыми" потоковыми классами AT&T.
Классы istream_withassign, ostream_withassign и iostream_withassign, включенные в некоторые старые потоковые библиотеки (и производные от istream, ostream и iostream соответственно), не поддерживаются стандартом. Их функциональность реализуется другими средствами.
Также в библиотеку IOStream входят дополнительные классы для выполнения форматированного ввода-вывода при работе с файлами и строками.
На следующем шаге мы рассмотрим глобальные потоковые объекты.