На этом шаге мы приведем более подробные определения классов.
Как и все шаблонные классы библиотеки 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 входят дополнительные классы для выполнения форматированного ввода-вывода при работе с файлами и строками.
На следующем шаге мы рассмотрим глобальные потоковые объекты.