Такие контейнеры, как стек, должны работать с элементами любых типов. Однако написать такой универсальный стек не так-то просто. Реализация с помощью нетипизированных указателей void* (см. главу 6), хотя и работоспособна, требует предельной аккуратности, иначе можно нарваться на очень неприятные ошибки. Кроме того, динамическое выделение памяти и косвенное обращение сказывается на эффективности, да и преобразования типов, которые нужно выполнять, не украшают текст программы. Наследование немного скрашивает эту безрадостную картину — можно «упрятать внутрь» и косвенное обращение, и преобразование типов (см. листинг 8.11). Однако наследование «добавляет неэффективности» — из-за наследования в программе должны присутствовать два класса вместо одного: базовый с указателями типа void * и наследник от него.
Все было бы гораздо проще, если бы тип можно было сделать параметром. Тогда при объявлении объектов-контейнеров можно было бы указывать, элементы какого типа будут размещаться в контейнере. Именно с этой целью в С++ первоначально были добавлены шаблоны (см. п. 14 в [1]). В С++ реализованы два вида шаблонов: шаблоны классов и шаблоны функций1 (см. п. п. 14.5.5 в [1]). Шаблоны классов, очевидно, в первую очередь предназначены для реализации обобщенных контейнеров и позволяют задавать типы элементов в качестве параметров контейнера. Конкретный тип элементов указывается при объявлении объекта. Часто шаблон класса называют параметризованным типом. Мы будем употреблять термины «параметризованный тип», «шаблонный класс», «шаблон класса» как эквивалентные. В этом же смысле будет использоваться слово «шаблон». Шаблоны функций рассматриваются в следующей главе.
Концепция шаблонов оказала колоссальное влияние на стиль программирования на С++. Достаточно сказать, что в стандарт была включена стандартная библиотека шаблонов (STL), содержащая контейнеры, итераторы и алгоритмы (см. п. 23 в [1]). Появился даже новый стиль программирования — обобщенное программирование.
Опубликовал Kest
December 05 2013 02:05:57 ·
0 Комментариев ·
3436 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.