Глава 10. Объектно-ориентированное программирование
несложно переписать под нужный тип. Более того, поскольку для большинства
типов никакого специфического поведения не требуется, в типаж сам по себе мо-
жет быть шаблоном класса. В этом случае как дополнительный параметр шабло-
на будет передаваться шаблонный класс, основанный на том же типе, что пере-
дан в качестве основного параметра — кроме тех редких случаев, когда требуется
реализовать специфическое поведение:
template
c l a s s M a t r i x T r a i t s
{
// . . .
} ;
template<>
c l a s s M a t r i x T r a i t s
{
// . . .
} ;
template
c l a s s m a t r i x
{
// . . .
} ;
. . .
m a t r i x > m1 ;
Как правило, члены класса-типажа являются статическими функциями, по-
этому его обычно используют без создания объекта.
10.6.2
Пример реальной иерархии шаблонов
Стандартная библиотека C++ практически полностью построена на шаблонах
и потому представляет достаточно примеров профессионального использования
данного механизма. Рассмотрим в качестве наглядной иерархии шаблонов уже
знакомые нам классы потокового ввода-вывода.
Изначально библиотека потокового ввода-вывода действительно представля-
ла собой такую иерархию классов, которая изображена на рис. 10.4. Однако по
мере увеличения спроса на приложения, работающие с текстом сразу на несколь-
ких языках, встал вопрос о поддержке кодировки Unicode, позволяющей совме-
щать в одной строке символы разных национальных алфавитов. В зависимости
от языка, символ в Unicode может кодироваться различным количеством байт
— от одного до четырёх. В C++ для поддержки таких символов существует тип
wchar_t
(от англ. wide characters — «широкие символы»). Фактически понадоби-
лось создать иерархию классов, аналогичную классам iostream, но работающих
с типом данных wchar_t вместо char. В итоге библиотека iostream была пере-
работана на основе механизма шаблонов.
Классы, основанные на шаблонах, носят имена, аналогичные описанным
в разделе 10.4.6, с добавлением приставки «basic» и знака подчёркивания:
basic_ios
, basic_istream, basic_ostream и т. д. Привычные программисту име-
на классов для работы с символами типа char (как, впрочем, и с wchar_t) реа-
лизованы через подстановку имени типа в конструкции typedef:
typedef b a s i c _ i o s i o s ;
Программирование на языке С++ в среде Qt Creator
10.7. Элементы стандартной библиотеки C++
321
typedef b a s i c _ i o s w i o s ;
typedef b a s i c _ i s t r e a m i s t r e a m ;
typedef b a s i c _ i s t r e a m wi s tream ;
. . . . . .
Используя базовые шаблоны библиотеки, можно реализовать потоковый
ввод-вывод на любом собственном типе символьных данных вместо существу-
ющих, подставив его в качестве параметра шаблона и обеспечив работу соответ-
ствующих операторов.
Хотя по виду конструкции typedef может показаться, что шаблоны библио-
теки потокового ввода-вывода имеют один параметр, на самом деле это не совсем
так. Второй параметр — это как раз типаж символов, т. е. отдельный шаблон-
ный класс, который реализует базовые операции с символами и строками для
заданного типа символов. Эти базовые операции — присваивание символов, ко-
пирование и сравнение их последовательностей, приведение к целому типу и др.
Данный параметр имеет значение по умолчанию, и потому может не использо-
ваться при объявлении экземпляров шаблона. В оригинале же шаблоны классов
потокового ввода-вывода выглядят следующим образом (в виду однотипности,
приведём по одному примеру для стандартного ввода-вывода, работы с файлами
и со строками):
template > b a s i c _ i s t r e a m ;
template > b a s i c _ i f s t r e a m ;
template , c l a s s A l l o c a t o r =
a l l o c a t o r > b a s i c _ i s t r i n g s t r e a m ;
Именно эти потоковые шаблоны определяют на самом деле методы для разбо-
ра и форматирования, являющиеся перегруженными версиями операторов ввода
operator>>
и вывода operator<<.
Аналогично реализованы шаблоны для потоковых буферов:
template > b a s i c _ s t r e a m b u f ;
template > b a s i c _ f i l e b u f ;
10.7
Элементы стандартной библиотеки C++
10.7.1
Базовые понятия
Стандартная библиотека C++ — это общий набор шаблонов классов и алгорит-
мов, позволяющий программистам легко реализовывать стандартные структуры
данных, такие как очереди, списки и стеки.
В библиотеке выделяют пять основных компонентов:
• Контейнер (container) — хранение набора объектов в памяти.
• Итератор (iterator) — обеспечение средств доступа к содержимому кон-
тейнера.
• Алгоритм (algorithm) — определение вычислительной процедуры.
• Адаптер (adaptor) — адаптация компонентов для обеспечения различного
интерфейса.
© 2015 Алексеев Е. Р., Злобин Г. Г., Костюк Д. А., Чеснокова О. В., Чмыхало А. С.
322
Do'stlaringiz bilan baham: |