Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003), страница 5
Описание файла
DJVU-файл из архива "Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003)", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр DJVU-файла онлайн
Распознанный текст из DJVU-файла, 5 - страница
Ь>). Исключение составляет <зсййеб. Ь>. Мы применяем его вместо <сзгййеб> и, следовательно, не определяем айте с и рсгйййй с с помощью префикса зсй::, поскольку таким образом обеспечивается большая переносимость, а применение всй:: зйзе г вместо зйзе с не дает никаких преимушеств. 1 Заметим, что в С++ синоним типа определяет псевдоним, а не новый тип, например: еурейея япе оепдсд| //ьепдед определяется как псевдоним япе 1пс 1 = 42; Ьепдеп 1 = 88; 1 = 1; // Корректно 1 = яз // Корректно 26 Глава 1.
Об этой книге 1.5. Стандарт и практика Несмотря на то что стандарт С++ доступен с конца 1998 года, вплоть до 2002 года не существовало широкодоступного компилятора, о котором можно было бы сказать, что он "обеспечивает полное соответствие стандарту". Таким образом, сегодня поддержка языка в компиляторах реализована по разному.
Есть среди них такие, которые способны компилировать большую часть кода, приведенного в этой книге, однако многие достаточно популярные компиляторы с большинством наших примеров могут и не справиться. Для таких нестандартных реализаций С++, как правило, приводятся альтернативные приемы, которые должны обеспечить полное или частичное решение проблем, но некоторые из описанных в книге методик для таких компиляторов сегодня недоступны.
Тем не менее авторы надеются, что эта проблема будет решена в широком масштабе, поскольку программисты требуют от производителей компиляторов строгого соответствия стандарту. Однако даже с учетом упомянутых трудностей язык программирования С++ находится в постоянном развитии.
Эксперты из сообщества С++ (независимо от того, входят они или нет в состав Комитета по стандартизации С++) уже обсуждают различные пути улучшения языка; при этом некоторые из потенциальных усовершенствований затрагивают шаблоны. Некоторые тенденции в этой области рассмотрены в главе 13, "Направления дальнейшего развития". 1.6. Примеры кода и дополнительная информация Получить доступ к демонстрационным программам и найти дополнительную информацию об этой книге можно на ее %еЬ-узле по адресу: Ьсср: //мьля. зовиссьн. сот/ стр1Ьоо)с/. Кроме того, большое количество дополнительной информации по рассматриваемой теме вы сможете получить на ЖеЬ-узле Дэвида Вандевурда (Ьс ар: / /ьлям.
чапдечоопйе . сом/ Тежр1асев) и в %еЬ в целом. Начать советуем с просмотра списка литературы к данной книге. 1.7. Обратная связь с авторами Мы приветствуем любые конструктивные отклики читателей — как отрицательные, так и положительные.
Нам обоим пришлось основательно потрудиться, чтобы создать для вас эту книгу, которую, надеемся, вы оцените как отличную. Однако в определенный момент мы просто вынуждены были прервать работу над ней, поскольку подошел срок "выпуска продукта". Следовательно, ни один нз наших читателей не застрахован от того, что прн изучении материала ему придется столкнуться с ошибками или несогласованностью, а также с отдельными моментами, которые 1.7. Обратная связь с авторами 27 нуждаются в доработке или с тем, что отдельные темы в книге не освещены вообще.
Ваши отклики дают нам возможность проинформировать всех читателей через %1еЬ- узел данной книги о найденных вами "узких местах" и улучшить таким образом ее последующие издания. Связываться с нами лучше всего по электронной почте (сшрХЬоо1сйЗониссзн. созе); однако, прежде чем посылать сообщение, удостоверьтесь, пожалуйста, что найденная вами неточность отсутствует в списке опечаток на нашем %еЬ-узле. Заранее благодарим вас за сотрудничество. Часть 1 Основы Эта часть книги знакомит читателя с общими концепциями и языковыми средствами шаблонов С++.
Она начинаегся с обсуждения основных задач и концепций на примерах шаблонов функций и шаблонов классов. В последующих главах рассматриваются некоторые дополнительные фундаментальные приемы работы с шаблонами, в частности параметры шаблонов, не являющиеся типами, ключевое слово сурепате и шаблоны- члены. В завершение приведены некоторые распространенные приемы применения шаблонов на практике. Данное введение в шаблоны частично использовано Николаи Джосатгисом (Ы(со!а1 М. 5оялбз) в его книге ОЬ|еспОпешел* Рго8гглляллд и1 С++, опубликованной издательством аппп %11еу апд Копя 1.Ы, 1БВИ 0-470-84399-3.
Эта книга представляет собой учебное пособие, в котором дается описание всех возможностей языка С++ и его стандартной библиотеки, а также их практического применения. Зачем нужны шаблоны В С++ можно объявлять переменные, функции и большинство других видов объектов, используя конкретные типы. Однако в основном код для обработки объектов различных типов выглядит практически одинаково. Это особенно справедливо, если для разных типов данных требуется реализовать алгоритмы наподобие быстрой сортировки либо способы обработки таких структур данных, как связанный список или двоичное дерево. В таких случаях код одинаков для всех используемых типов объектов.
В общем случае (если язык программирования не поддерживает специальных средств лля решения подобных задач) у программиста имеются только следующие альтернативы: 1. Можно вновь и вновь реализовывать один и тот же алгоритм лля каждого типа данных. 2. Можно написать общий код для обобщенного базового типа, такого, как ОЬЗесг или чоха*. 3. Можно использовать специальные препроцессоры.
Часть 1. Основы ЗО Если говорить о конкретных языках (таких, как С, 1ача или подобных им), то читателю, возможно, уже приходилось проделывать подобные действия. Однако кюклый из описанных выше подходов имеет свои недостатки. 1. Каждый раз заново реализуя один и тот же алгоритм, мы, по сути, снова и снова изобретаем велосипед. Мы делаем одни и те же ошибки и, чтобы не наделать их еще больше, стараемся избегать более сложных, но зато и более эффективных алгоритмов. 2. Если мы пишем обобщенный код для общего базового класса, то теряем при этом преимущество проверки типов. Кроме того, в разных ситуациях может потребоваться порождение от различных базовых классов, что еще более затрудняет поддержку кода.
3. При использовании специального препроцессора, например препроцессора С/С++, теряется преимущество форматирования исходного кода. Код заменяется некоторым "тупым механизмом замены текста'*, который не имеет представления ни об области видимости, ни о типах. Шаблоны обеспечивают решение данной проблемы, лишенное недостатков, присущих рассмотренным способам. Шаблон представляет собой функцию или хаасс, реализованные для одного или нескольких типов данных, которые не известны в момент написания кода. При использовании шаблона в качестве аргументов ему явно или неявно передаются конкретные типы данных.
Поскольку шаблоны являются средствами языка„для них обеспечивается полная поддержка проверки типов и областей видимости. Шаблоны получили широкое применение в современном программировании. Например, практически весь код в стандартной библиотеке С++ состоит из шаблонов. Библиотека обеспечивает алгоритмы для сортировки объектов и значений определенного типа, структуры данных (так называемые классы контейнеров) для управления элементами конкретного типа, строки, для которых тип символа является параметризованным, и т.п. Однако это еще не все: шаблоны позволяют также параметризовать способы обработки данных, оптимизировать код и параметризовать информацию.
Как это делается, описано в последующих главах. А пока начнем с самых простых шаблонов. Глава 2 Шаблоны функций Данная глава знакомит читателя с шаблонами функций. Шаблоны функций — это параметризованные функции; таким образом, шаблон функции представляет целое семейство функций. 2.1. Первое знакомство с шаблонами функций Шаблон функции — это обобщенное описание поведения функций, которые могут вызываться для объектов разных типов; другими словами, шаблон функции представляет семейство функций.
Шаблон очень похож на обычную функцию, разница только в том, что некоторые элементы этой функции не определены и являются параметризованными. Чтобы проиллюстрировать сказанное выше, рассмотрим небольшой пример. 2.1.1. Определение шаблона Ниже приведен шаблон функции, возвращающей большее из двух значений. // Ьаз1сз/пах.Ьрр Сетпр1асе <сурепке Т> йп11пе Т сопзгй щах(Т сопзсй а, Т сопзгй Ьт ( // Если а < Ь, возвращаем Ь, иначе а гесигп а < Ь 7 Ь : ат ) Определение шаблона задает семейство функций, возвращающих большее из двух значений; эти значения передаются функции как ее параметры а и Ь. Тип этих параметров оставлен не определенным и задается как лараиелтр шаблона т. Как можно видеть из приведенною примера, параметры шаблонов необходимо объявлять, используя следующий синтаксис: сетар1асе < разделенный запятыми список параметров > В нашем примере список параметров задан как сурепаще т.
Обратите внимание„ что в качестве скобок используются символы "меньше" и "больше". Ключевое слово Глава 2. Шаблоны функций 32 сурепаве задает так называемый параметр тииа. Это наиболее распространенный внд параметров шаблонов в программах на С++, хотя возможны и другие параметры, которые рассматриваются в книге несколько позже (см. главу4, *'Параметры шаблонов, не являющиеся типами").