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

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

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

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

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

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

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

Эта концепция называется выводом аргументов шаблона функции (бгпсг/оп гетр!аге агйитвнг г)ег/исг/он) и обеспечивает возможность вызывать шаблонную функцию так же, как и обычную. Однако, как уже упоминалось ранее, можно явно инстанцировать шаблон для конкретных типов. Сещр1апе <Сурепаще Т> йп11пе Т сопела щах(Т сопвСй а, Т сопвса Ь); лах<ггоцЬ1е>(4,4.2) г // Инстанцирование для Т, // представляющего собой с)опЬ1е В тех случаях, когда связь между параметрами шаблона и параметрами вызова отсутствует или когда невозможно определить параметры шаблона, аргумент шаблона в его вызове следует задавать явно. Например, можно ввести третий тип аргумента шаблона, который залает тип значения, возвращаемого функцией.

СЕщр1асЕ <СурЕПаща Т1, СурЕПаГВЕ Т2, СурЕПащЕ КТ> Тп11пе КТ щах(Т1 сопвпй а, Т2 сопвпа Ь): Однако вывод аргументов шаблона не работает с возвращаемыми типами, а КТ сре- 5 ди типов параметров вызова функции отсутствует. Следовательно, для определения КТ в Нельзя возвращать значения по ссылке, если сии являются локальными для функции, поскольку при этом возвращается нечто, уже ие существующее (пссле того как программа покинет область видимости данной функции). 5 Вывод можно рассматривать как часть распознавания имени функции цо типам ее параметров — процесс, который ие использует тиц возвращаемого значения. Единственным исключением является тиц возвращаемого значения оператора-члена преобразования типов. 2.4. Перегрузка шаблонов функций 37 обычный вывод применить нельзя, а значит, список аргументов шаблона нужно задавать явно, например: Севр1асе <сурепаве Т1, Сурепаве Т2, Сурепаве КТ> Тп11пе КТ вах(Т1 сопзпа а, Т2 сопнпа Ы; вах<1пп, доиЫе, с)оцЫе> (4, 4.

2) // ВЕРНО, но утомительно До сих пор рассматривались случаи, когда все аргументы шаблона функции либо задавались явно, либо явно не задавался ни один из них. Существует еще один подход: явно задается только первый аргумент, а остальные определяются при помощи вывода. Общее правило можно сформулировать так: следует явно задавать все типы аргументов, которые нельзя определить неявно. Таким образом, если в нашем примере изменить порядок следования параметров шаблона, то при вызове потребуется указать только тип возвращаемого значения.

Севр1апе <Сурепаве ПТ, Еурепатпе Т1, Сурепаве Т2> Тп11пе НТ вах(Т1 сопвпа а, Т2 сопзпа Ы; щах<с)опЬ1е>(4,4.2) // ВЕРНО: тип возвращаемого // значения — доиЬ1е В данном примере при вызове щах<с(оиЫе> значение НТ явно задается как с)опЬ1е, а типы параметров Т1 и Т2 определяются путем вывода из переданных аргументов как 1пс и доиЫе. Заметим, что все рассмотренные выше модифицированные версии вах ( ) не обеспечивают сколько-нибудь значительных преимуществ — ведь ничто не мешает для версии с одним параметром явно указать тип параметра (и тип возвращаемого значения) для случая передачи аргументов различных типов.

Поэтому лучше не усложнять себе жизнь и остановиться на версии вах ( ) с одним параметром (именно так мы и будем поступать в следующих разделах при обсуждении других вопросов, касающихся шаблонов). Процесс вывода более подробно описан в главе 11, "Вывод аргументов шаблонов". 2.4. Перегрузка шаблонов функций 1 Шаблоны могут быть перегружены точно так же, как и обычные функции.

Другими словами, могут иметься различные определения функций с одним и тем же именем, и при вызове функции с этим именем компилятор С++ примет решение о том, какую из функций-кандидаток следует вызвать. Правила принятия такого решения достаточно сложны даже без использования шаблонов. В этом разделе рассматривается перегрузка при участии шаблонов. Читателям, не знакомым с основными правилами перегрузки без шаблонов, рекомендуем обратиться к приложению Б, "Разрешение перегрузки", где дается достаточно подробный обзор правил перегрузки функций.

Приведенная ниже небольшая программа иллюстрирует перегрузку шаблона функции. Глава 2. Шаблоны функций 38 // Ьаз1сз/шах2.срр // Большее из двух целочисленных значений Тп1зпе Тпг сопвгй шах(йпс сопвгй а, йпс сопзгй Ь) ( гесцгп а < Ь ? Ь : а; ) // Большее из двух значений произвольного типа Сешр1асе <Сурепазае Т> Тп11пе Т соплей шах(Т сопзгй а, Т соплей Ь) ( гегцгп а < Ь? Ь: а; ) // Большее из трех значений произвольного типа Сешр1аге <Гурепаше Т> Тп11пе Т соплей шах(Т сопвей а, Т соплей Ь, Т сопзей с) ( геецгп шах(щах(а,Ь),с)ю йпг шайп(); ( ::шах(7, 42, 68) ::шах(7 .О, 42 .0) Как видно из данного примера, нешаблонная функция может вполне мирно сосуществовать с одноименным шаблоном функции, который может быть инстанцирован с тем же типом.

При прочих равных условиях процесс распознавания имени функции по типам ее параметров обычно отдает предпочтение нешаблонным версиям, а не тем, которые генерируются на основе шаблонов. В соответствии с этим правилом в четвертом вызове шах ( ) инстанцирование шаблона не состоится. шах(7,42); // При наличии двух Тпс будет вызвана // функция, не являющаяся шаблоном // // // ::шах('а', 'Ь'); // ::шах(7, 42); // // // ::шах<>(7, 42); // :: шах<с)оцЬ1е> (7, 42); // // ::шах('а', 42.7); // // Вызов шаблона для трех аргументов Вызов шах<с)оцЬ1е> (вывод аргументов) Вызов шах<сЬаг> (вывод аргументов) Вызов функции, не являющейся шаблоном, для двух целочисленных аргументов Вызов шах<Тле> (вывод аргументов) Вызов шах<с)оцЬ1е> (без вывода аргументов) Вызов функции, не являющейся шаблоном, для двух целых значений 2,4. Перегрузка шаблонов функций 39 По если на базе шаблона возможно сгенерировать функцию, которая для данного вызова подходит лучше, то выбор будет сделан в пользу шаблона.

Это можно продемонстриро- вать иа примерах второго и третьего вызовов гпах ( ) . Можно указать пустой список аргументов шаблона. Такой синтаксис определяет, что вы- зов можно выполнить только при помощи шаблона, но все параметры шаблона должны определяться на основе аргументов вызова. шах<>(7,42); // Вызов пах<Тле> (вывод аргументов) Поскольку автоматическое преобразование типов для шаблонов невозможно, но вполне применимо для обычных функций, для последнего вызова используется не являющаяся шаблоном функция (при этом и ' а ', и 42 . 7 конвертируются в Тпг).

шах('а', 42.7); // Различные типы аргументов допустимы // только в функции, не являющейся // шаблоном Приведем еще более полезный пример: перегрузка шаблона функции, вычисляющей наибольшее значение для указателей и обычных строк в С-стиле. // Ьавйсз/гпахЗ.срр $1пс1ибе <Товсгеаш> 41пс1ис)е <свттйпд> 41пс1ибе <втгйпд> // Наибольшее из двух значений произвольных типов тешр1аге <Сурепаше Т> йп11пе т сопвсй шах(т сопвтй а, т сопвсй Ы ( гесигп а < Ь ? Ь : а; ) // Наибольший из двух указателей тешр1асе <сурепаше Т> йп11пе Т* сопвтй лах(Т* сопвтй а, Т* сопвтй Ы ( гетитп *а < *Ь ? Ь : а; ) // Наибольшая из двух С-строк йп11пе сЬаг сопит* 'сопвтй пах(сЬат сопит* соплей а сЬат сопит* сопвсй Ы ( тесигп всб::встсшр(а,ь) < О ? ь : а; ) йпс паэ.п() л1ах (7. О, 42.

0); шах('а', 'Ь'); // Вызов пах<с)оиЬ1е> (вывод // аргументов) // Вызов шах<сЬаг> (вывод // аргументов) 40 Глава 2. Шаблоны функций 1пс а = 7; 1пс Ь = 42; ::вах(а,Ы; // вах() для двух значений 1пс вМ::вгг1пд в="Ьеу"; вей::всгйпд с="уои"; ::вах(в,с); // пах() для двух значений вес)::всг1пд 1пс* р1 = йЬ; 1пе* р2 = йа; :вах(р1,р2); // вах() для двух указателей сЬаг сопвг* в1 = "Пач1с)"; сЬаг сопве* в2 = "Н1со"; ::вах(з1,в2); // вах() для двух С-строк ) Заметим, что аргументы для всех перегруженных реализаций передаются по ссылке.

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

// Ьавйсв/вахЗа.срр ()1пс1ийе <1овггеав> ()1пс1ис)е <свсг1пд> ()1пс1ис)е <всгйпд> // Наибольшее из двух значений произвольного типа // (передача по ссылке) севр1асе <Сурепаве Т> 1п11пе Т сопвей вах(т сопвсй а, т сопвсй Ы ( гесигп а < Ь ? Ь : а ) // Наибольшая из двух С-строк // (передача по значению) 1п11пе сЬаг сопвг* пах(сЬаг сопвг* а, сЬаг сопвг* Ы гееигп вес(::всгсвр(а,Ы < 0 ? Ь : а; ) // Наибольшее из трех значений произвольного типа // (передача по ссылке) 2.4. Перегрузка шаблонов функций 41 Сешр1асе <Гурепаше Т> йп11пе Т соплей шах(Т сопвгй а.

Т сопвгй Ь, Т сопвей с) ( гетпгп шах(шах(а,Ь),с); // ОШИБКА, если в шах(а,Ь) // используется передача // по значению йпс пе1п() ( ::шах(7,42,68)) // ВЕРНО сопвс сЬаг* з1 =, "йгес(ег1с" з сопзс сЬаг* в2 = "ап1са"; сопзг сЬаг* вЗ = "1цсаз"; ::шах(в1,в2,вЗ)) // ОШИБКА ) Проблема заключается в том, что если мы вызываем шах ( ) для трех С-строк, то инструкция гесцгп шах (шах(а, Ь), с) становится некорректной. Это происходит потому, что в шах ( ) для С-строк создается новая временная локальная переменная, которую функция возвращает по ссылке. Здесь приведен только один пример кода, который вследствие нюансов правил перегрузки функций работает иначе, чем можно было бы ожидать. Например, может имеп (а может и не иметй) значение то, что не все перегруженные функции являются видимыми в момент вызова соответствующей функции.

Так, определение версии гаах ( ) с тремя аргументами для йпе при отсутствии объявления специализированной двухаргументной версии шах() для йпс приводит к тому, что в трехаргументной версии используется двухаргументный шаблон. // Ьавфсз/шах4.срр // Наибольшее из двух значений произвольного типа Сешр1аге <Сурепаше Т> йп11пе Т соплей шах(Т сопзей а, Т сопвей Ь) ( геецгп а < Ь 7 Ь : а; ) // Наибольшее из трех значений произвольного типа Сешр1аге <сурепаше Т> фп11пе Т сопвгй шах(Т сопвгй а, Т сопвсй Ь, Т сопвсй с) ( гесцгп шах(гаах(а,Ь),с); // Используется шаблонная // версия даже для значений // йпг, поскольку объявление функции для // двух йпс располагается позже данного Глава 2.

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