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

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

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

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

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

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

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

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

В нашем случае тип Т должен поддерживать оператор <, поскольку он используется в теле функции для сравнения а и Ь. В силу исторических причин для определения параметра типа разрешается применение вместо сурепаве ключевого слова с1авв. Ключевое слово сурепаве в ходе эволюции языка С++ появилось относительно недавно, а до этого единственным способом задания параметра типа было ключевое слово с1авв. Применение с1авв для определения параметра типа корректно и сегодня.

Поэтому эквивалентным способом определения шаблона вах () является следующий: // Ьавзсв/вах.Ьрр Севр1аге <с1авв Т> Тп11пе Т сопвса вах(Т сопвса а, Т сопвса Ь) // Если а < Ь, возвращаем Ь, иначе а гесцгп а < Ь ? Ь : а; Семантически в данном контексте между этими двумя способами записи нет никакой разницы. Даже в случае применения ключевого слова с1авв для аргументов шаблона может быть использован любой тип. Однако, поскольку ключевое слово с1авв может ввести в заблуждение (вместо Т можно подставлять не только тип, являюшийся классом), в данном контексте следует отдавать предпочтение использованию ключевого слова гурепаве.

Отметим, что в отличие от объявлений типа класса, ключевое слово всгцсс при объявлении параметров типа вместо гурепаве использовать нельзя. 2.1.2. Использование шаблонов В приведенном ниже фрагменте кода иллюстрируется применение шаблона функции вах () . // Ьавйсе/вах.срр №Тпс1ис)е <Товсгеав> №Тпс1цйе <всгйпй> №Тпс1иде <вах.Ьрр> Тпс ва1п() 2.1.

Первое знакомство с шаблонами функций 33 1пс 1 = 42; все)::соус « "шах(7,1): " «::шах(7,1) «зМ::епс)1/ с)оиЬ1е Е1 = 3.4; йоиЬ1е 12 = -6.7; зМ::соус « "шах(х1,г2): " «::щах(Е1,Е2) «зсс)::епс)1; зсд::вст1пд в1 = "гаасЬепщсйсвч; зЫ::вШ.пд в2 = "лшсЬ"; вМ:чсоцс « "шах(в1,в2): " «::шах(в1,в2) «вЫ::епс(1; ) В этой программе гаах() вызывается трижды: для двух значений типа 1пг, для двух с)оиЬ1е и для двух все):: всгйпд. Каждый раз вычисляется большее значение. В результате программа выводит следующую информацию: шах(7, 1): 42 шах (11, 12): 3 .

4 шах(в1,в2): шасЬещасйсз Вы обратили внимание на то, что в примере каждый вызов шаблона шах ( ) предваряется двумя двоеточиями —::? Делается это вовсе не потому, что шах ( ) находится в глобальном пространстве имен. Причина здесь другая: в стандартной библиотеке тоже есть шаблон всс)::шах ( ), который может быть вызван при определенных обстоятельствах или способен привести к неоднозначности . 1 Обычно шаблоны не компилируются в какой-то один объект, способный обрабатывать любой тип данных. Вместо зтого из шаблона генерируются различные объекты для г з каждого типа, для которого применяется шаблон . Таким образом, щах ( ) компилируется отдельно для каждого из упомянутых типов.

Например, для первого вызова шах ( ) 1пг 1 = 42; шах(7,1) используется шаблон функции, в котором в качестве параметра шаблона т указан тип 1пс. Таким образом, он имеет семантику вызова следующего кода: 1п11пе 1пс сопвса лах(1пс сопвсй а, 1пс сопзса Ь) ( // Если а < Ь, то возвращаем Ь, иначе а 1 Например, если один тип аргумента определен в пространстве имен всс (налример, вгкьпд), тогда в соответствии с правилами поиска имен С++ будут найдены оба шаблона — как глобальный, так и зсо::тах О. 2 Альтернативный способ — "один объект на все случаи жизни" — также имеет право на существование, но на пракгике встречается крайне редко.

Все правила языка основываются на предположении, что генерируются различные объекты. Глава 2. Шаблоны функций. 34 гекпгп а < Ь ? Ь : аг Процесс подстановки конкретных типов вместо параметров шаблона называется инстанцированиеи шаблона (швгангийон). Его результатом является экземпляр шаблона К сожалению, термины инстанцированне (тлншйайоп) и экземпляр (иигансе) в объектноориентированном программировании применянзтся и в другом контексте, а именно для конкретного объекта класса Однако, поскольку наша книга посвяшена шаблонам, этот термин будет использоваться применительно к шаблонам, если специально не оговорено другое.

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

1. Без инстанцирования; код самого шаблона проверяется на правильность синтаксиса. Выявляются синтаксические ошибки, например пропушенные точки с запятой. 2. Во время инстанцирования код шаблона проверяется на корректность всех вызовов. Выявляются некорректные вызовы, в частности неполдерживаемые вызовы функций. Здесь проявляется важная проблема, связанная с обработкой шаблонов: если применение шаблона функции предполагает инстанцирование, то компилятору в определенный момент потребуется полное определение этого шаблона. Это отличается от обычных функций, когда для компиляции достаточно их объявления. Методы решения этой проблемы обсуждаются в главе 6, "Применение шаблонов на практике". А пока возьмем на вооружение простейший способ: реализуем каждый шаблон в заголовочном файле с использованием встраиваемых функций.

2.2. Вывод аргументов При вызове шаблона функции (например, шах ( ) ) с какими-либо аргументами паРаметры шаблона определяются передаваемыми в функцию аргументами. Если в качестве параметров 2.3. Параметры шаблонов 35 типа Т сопвсй передается два значения з.пе, компилятор делает вывод, что вместо Т следует подставить Епш Заметим, что автоматическое преобразование типов в шаблонах не допускается. Должно быть точное соответствие для каждого параметра типа, например: Сешр1аее <Сурепаше Т> Еп11пе Т сопзсй шах(т сопнсй а, Т сопзсй Ь) шах(4,7); // ВЕРНО: Т вЂ” Тпе для обоих аргументов шах(4,4.2); // ОШИБКА: первый Т вЂ” Тпт, второй — г)опЬ1е Существует несколько способов исправить эту ошибку. 1.

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

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

Для реапизапии такой возможности в современных компиляторах С++ технических препятствий не существует, и в будущем задание параметров шаблона по умолчанию, вполне вероятно, станет возможным (см, раздел 13.3). 36 Глава 2. Шаблоны функций // значения определяется типом первого // аргумента Казалось бы, неплохо иметь возможность передавать шаблону щах ( ) два параметра вызова различных типов, но этот способ имеет свои недостатки. Проблема заключается в том, что мы должны объявить тип возвращаемого значения. Если для этого использовать один из типов параметров, аргумент для другого параметра должен конвертироваться в этот же тип, независимо от того, что именно хотел бы получить вызвавший этот шаблон программист.

В С++ нет возможности задать выбор "наиболее мощного типа" (хотя такую возможность можно обеспечить с помощью определенных трюков при программировании шаблонов— см. раздел )5.2.4, стр. 298). Таким образом, в зависимости от порядка аргументов при вызове можно получить наибольшее из значений 42 и б б . б б и как с)оцЬ1е 6 б . б б, и как Тпс б б. Еше олин недостаток заключается в том, что при конвертировании типа второго параметра в тип возвращаемого значения создается новый локальный временный обьект, а зто означает, 4 что возврат результата по ссылке невозможен . Поэтому в нашем примере тип возвращаемого значения должен быть т1, а не т1 сопвса. Поскольку типы параметров вызова конструируются из параметров шаблона, параметры шаблона и параметры вызова обычно взаимосвязаны.

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