Главная » Все файлы » Просмотр файлов из архивов » Файлы формата DJVU » Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003)

Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003), страница 9

DJVU-файл Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003), страница 9 Языки программирования (3274): Книга - 7 семестрД. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003): Языки программирования - DJVU, страница 9 (3274) - СтудИзба2019-09-19СтудИзба

Описание файла

DJVU-файл из архива "Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003)", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Просмотр DJVU-файла онлайн

Распознанный текст из DJVU-файла, 9 - страница

Точно так же, пугем объявления и использования ЯгасК<вМ:: вгкйпд>, создается объект на базе вектора, элементами которого являются строки, и для каждой из вызываемых функций-элементов инстанцируется код для этого типа. Заметим, что инстанцирование происходит только для вызываемых функций-членов. Для шаблонов классов экземпляры функций-членов инстанцируются только при их использовании. Очевидно, что такой подход позволяет сэкономить время и память. Дает он и еще одно преимущество — возможность инстанцирования даже для тех типов, для которых выполняются не все операции в функциях-членах, — при условии, что "проблемные" функции-члены не вызываются. В качестве примера рассмотрим класс, в котором в некоторых функциях-членах для сортировки элементов используется оператор <.

Если исключить вызовы этих функций-членов, то можно инстанцировать шаблон класса для тех типов, для которых оператор < не определен. В данном примере инстанцируются конструктор-ве умолчанию, а также функции ров)з () и сор ( ) для значений типа 1пс и строк. Однако функция рор ( ) инстанцируется только для строк. Если шаблон класса имеет статические элементы, то они инстанцируются однократно для каждого типа. Тип инстанцированного шаблона класса можно использовать так же, как и любой другой тнп, при условии поддержки необходимых операций.

З.З. Специализации шаблонов класса 49 типы ТпсЯсасК и ЯсасК<йпс> представляют собой один и тот же тип; эти обозначения можно использовать одно вместо другого и присваивать друг другу переменные этого типа. Аргументы шаблона могут быть любого типа, например указателями на Т1оаг или даже стеками целых чисел.

ЯгасК<б1оас*> Й1оакрсгЯсасК; // Стек указателей на значения б1оас ягасК<ясасК<1пс» ТпсясасКясасК; // Стек стеков значений Тпг Должно выполняться только одно требование: чтобы любая вызываемая операция для данного типа была допустима Обратите внимание, что между двумя закрывающими угловыми скобками следует помешать пробел. Если этого не делать, то две угловые скобки будут интерпретироваться как оператор», что приведет к синтаксической ошибке. ягасК<ягасК<1пс» 1псясасКясасК; //ОШиБкд: » не допускается 3.3. Специализации шаблонов класса Шаблон класса можно специализировать для конкретных аргументов шаблона.

Так же, как н в случае перегрузки шаблонов функций (см. раздел 2.4, стр. 37), специализированные шаблоны классов позволяют оптимизировать реализации для конкретных типов нли корректировать неверное поведение определенных типов для инстанцирования шаблона класса. Однако при специализации шаблона класса необходимо специализировать все его функции-члены.

Хотя можно специализировать и отдельную функцию-член, после этого нельзя будет специализировать целый класс. Чтобы специализировать шаблон класса, следует объявить класс, предварив его конструкцией сетр1асе<>, и указать типы, для которых специализируется шаблон класса. Типы используются в качестве аргументов шаблона и задаются непосредственно после имени класса. сепр1асе<> с1авв ясасК<вМ::всг1пд> ( Для таких специализаций любая функция-член должна определяться как "обычная" функция-член с заменой каждого включения Т специализированным типом.

УоЫ ЯкасК<всс)::вггйпд>::ривЬ(вес)::всгйпд соплей е1еза) ( е1еив.рив)т ЬасК(е1ет); // добавление копии элемента // в конец массива 50 Глава 3. Шаблоны классов // Ьав1сз/вгас)<2.Ьрр ()1пс1ийе <йедне> ()1пс1ийе <вгг1пд> ()1пс1пйе <вейехсере> ()1пс1ийе "аеас)с1.Ьрр" Гешр1аее <> с1авв Ягас)е<вгй::вгг1пд> ( рг1ваее: вей::йене <вГй::вгг1пд> е1ешя; // Элементы риЬ11с: чо1й ривЬ(вей::зггрпд сопвей) // Добавление // элемента //Снятие элемента со стека //Возврат элемента //с вершины стека Ьоо1 ешргу() сопве ( // Возвращает Егие, гееигп е1ещв.ешргу(); // если стек пуст дотй рор(); згй::вгг1пд ТорЯ сопвг чо1й Яеас)«вей::вег1пд>::рияЬ(вей::вег1пд сопиев е1еш) ( е1ешв.ривЬ Ьас)е(е1еш); // Добавление копии // элемента в стек т/о1й Яеас)«яей::вггбпд>::рор() ( 1г (е1ешз.ешреу()) ( еЬгоы вМ::оие ой гапде("Ягас)«вгй::вггйпд>::рор():" ешргу аеас)е"); ) е1ешз .

рор Ьас)< ( ); // Удаление последнего элемента вей::яег1пд Яеас)«вей::вгг1пд>::Гор() солне ( з.б (е1ешз.ешрТу() ) ( еЬгон яей::оиг ой гапде("Яеас)«вгй::вег1пд>::гор():" ешргу веас)<"); ) гегигп е1ещв.Ьас)е(); // Возврат копии // последнего элемента ! Далее приведен завершенный пример специализации я гас)«> дла типа з ей:: заг1пд. 51 5 4, Частичная специализация В данном примере для управления элементами в стеке вместо вектора используется очередь с двусторонним доступом (дек). Такая замена не дает особых преимушеств; это сделано, чтобы показать, что реализация специализации может значительно отличаться от реализации первичного шаблона'. 3.4.

Частичная специализация Специализация шаблонов классов может быть частичной. Можно определить реализации для определенных типов, но при этом некоторые параметры шаблона остаются задаваемыми пользователем. Например, для шаблона класса Сешр1асе<сурепазве Т1, Сурепаше Т2> с1авв МуС1авз ( возможны следующие частичные специализации: // Частичная специализация: оба параметра шаблона // имеют один и тот же тип Сешр1аве<сурепаше Т> с1азз МуС1азв<Т,Т> ( // Частичная специализация: тип второго параметра — 1пт сешр1апе<турепаше Т2> с1авв МуС1авв<Т,Тпв> ( // Частичная специализация: оба параметра — указатели Сешр1ате<вурепаше Т1, Сурепаше Т2> с1авв МуС1авв<Т1*,Т2*> ( В приведенном далее примере показано, какие шаблоны применяются при разных объявлениях.

МУС1азв<1пс,й1оап> шйй; // Используется МуС1авз<Т1,Т2> МУС1азв<к1оас,т1оат> шбб; // Используется МуС1авв<Т,Т> з В действительности при использовании дека вместо вектора лля реализации стека определенное преимущество все-таки есть: при удалении элементов происходит освобождение паюпи, кроме того, ие может произойти перемещение элементов вследствие перераспределения памяти (впрочем, лля строк это ие такое уж значительное преимущество).

По этой причине в основном шаблоне класса лучше использовать лек (как это сделано в классе всс:: всаск<> в стандартной библиотеке С++). Глава 3. Шаблоны классов 52 МуС1авв<й1оас,йпг> щйй; // Используется МуС1авв<Т,Тпс> МуС1авв<йпг*,Е1оаг*> щр; // Используется МуС1авв<Т1*,Т2*> Если для обьявления одинаково хорошо подходит несколько частичных специализаций, получается неоднозначность, неразрешаемая компилятором.

МуС1авв<йпс, 1цг > ш; //ОШИБКА: соответствуют // МуС1авв<Т,Т> и МуС1авв«Т,Тпс> МуС1авв<1пг*, Тпе*> кц //ОШИБКА: соответствуют // МУС1авз<Т,Т> и МуС1авз<Т1*,Т2*> Чтобы избежать неоднозначности во втором случае, можно использовать дополнитель- ную частичную специализацию для указателей одного и того же типа: Сещр1асе<сурепаще Т> с1авв МуС1авв<Т*,Т*> ( Более подробно этот вопрос рассматривается в разделе 12.4, стр. 225. 3.5. Аргументы шаблона, задаваемые по умолчанию В случае использования шаблонов класса для параметров шаблона можно определять значения по умолчанию. Эти значения цазываются аргументами шаблона но умолчанию. Например, в классе Ясас)«<> можно использовать второй параметр шаблона, определяюший контейнер, который применяется для хранения элементов, в качестве значения по умолчанию указывал тип вес):: тес гог<>.

// Ьав1сз/згас1«З.Ьрр ()Тпс1ис(е <чесгог> ()1пс1ибе <згбехсерс> вес): гиессог<Т» // Элементы Сешр1аге <сурепаще Т, Сурепаше СОЫТ = с1авв Ясас)с ( ргйчасе: СОМТ е1етв; риЬ11с: чо16 резь(т сопвса)) чоЫ рор(); Т Сор() солне; // // // // Ьоо1 ещргу() сопят ( // гегпгп е1ешз.ешрсу(); // дооавление элемента Снятие со стека Возврат элемента с вершины стека Возвращает сгие, если стек пуст 3 5, Аргументы шаблона, задаваемые по умолчанию 53 сещр1асе<сурепагае т, сурепагае соит> чозс) ЯгасК<Т, СОИТ>::РивЬ(Т сопвга е1ега] ( е1егав.ривЬ ЬасК(е1егв); // Добавление элемента ) сегар1асе<сурепаве т, сурепагае сОьгт> чозс) ЯеасК<Т,СОЬГт>::рор() ( Тб (е1егав.епреу() ) ( сЬгоы все)::оис об гапде("ясасК<>::рор():" егарсу всасК"); ] е1егав.рор ЬасК(); // Удаление последнего элемента ) Сетр1аее<еурепагае Т, Сурепагае СОИТ> Т ЯгасК<Т,СОЬгТ>:гбор() сопвг ( 1б (е1евв.егареу()) ( сЬгоы вМ::оис ой галде("ЯсасК<»:вор(]:" егпрсу вгасК"); гесигп е1елш .ЬасК()г // Возврат копии // последнего элемента ) Заметим, что, поскольку теперь у нас два параметра шаблона, каждое определение функции-члена должно иметь два параметра.

сепр1асе<сурепагае Т, Сурепазае СОЫТ> чоЫ ягасК<Т,СО1)Т>::ривЬ(Т сопвсй е1еж) ( е1егав.ривЬ ЬасК(е1ега); // добавление элемента ) Этот стек можно использовать точно так же, как и раньше. Если шаблону передается только первый аргумент, представляюший тип элементов в стеке, то для хранения элементов этого типа используется вектор. Сеыр1асе<гурепагае Т, Сурепагпе СОг)Т = вес):гуесгог<Т» с1авв ЯсасК ( ргйоасе: СОЛТ е1етв; // Элементы 54 Глава 3.

Шаблоны классов При объявлении объекта ЯсасК в нашей программе можно явно указать, какой контейнер должен использоваться для хранения элементов. // Ьав1св/веасКЗСевС.Ьрр ()1пс1ис)е <1овсгеалп> $1пс1иде <бесрле> ()1пс1ис)е <свес)11Ь> 41пс1ибе "всасКЗ.Ьрр" 1пс пайп; ( агу ( ЯпасК<1пс> 1пТЯСасК; // Стек значений 1пп // Стек значений с)оиЬ1е, в котором для хранения // элементов используется всб::с)ес)ие<> ясасК<боиЬ1е, всб:: бесрле<с)оиЬ1е» с)Ь1ясас)с; // Работа со стеком целых чисел 1псЯсасК.ривЬ(7)л вес)::соие « 1пСЯСасК.Сор() « вас)::ела; // Работа со стеком чисел с плавающей точкой с)ЫЯсасК.ривЬ(42.42); вМ::соис « с)ЫЯсасК.сор() « всб::ела/ с)Ь1ЯСасК.рор(); с)ЫясасК.рор(]; ) сассЬ(вайс:ехсерс1оп сопвса ех) ( вес)::сект « "Ехсерсйопс « ех.ыЬас() « вес)::епс)1/ гееигп ЕХ1Т РА1Ь(ЖЕ; // Выход из программы // с указанием ошибки ) ) С помощью конструкции ЯсасК<с)оиЬ1е, вМ:: с)еслие<с)оиЬ1е» объявляется стек значений с)оиЬ1е, в котором для внутренней работы с элементами используется контейнер вес): с с)ес)ие<>.

3.6. Резюме ° Шаблон класса — это класс, который реализован с одним или несколькими параметрами типов, остающимися открытыми. З 6. Резюме 55 ° Чтобы применить шаблон класса, нужно использовать конкретные типы в качестве аргументов шаблона. После этого шаблон класса инстанцируется (и компилируется) для указанных типов. ° Для шаблонов классов инсганцируются только те функции-члены, которые реально вызываотся в программе. ° Можно специализировать шаблоны классов для конкретных типов.

° Можно выполнять частичную специализацию шаблонов классов. ° Для параметров шаблона класса можно задавать значения по умолчанию. Эти значения могут использовать'предшествующие параметры шаблона. Глава 4 Параметры шаблонов, не являющиеся типами В качестве параметров шаблонов классов или функций могут выступать не только типы, но и обычные величины.

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5301
Авторов
на СтудИзбе
417
Средний доход
с одного платного файла
Обучение Подробнее