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

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

Файл №1160769 Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003) (Д. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003)) 23 страницаД. Вандевурд, Н.М. Джосаттис - Шаблоны C++. Справочник разработчика (2003) (1160769) страница 232019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 23)

8.3.1. Аргументы )(ниблонов функций Аргументы шаблона функции могут быть заданы явно либо получены путем вывода на основе способа использования шаблона. // беса11з/шах.срр Гешр1аге<еурепаше Т> гп11пе Т сопвса шах(Т сопиев а, Т сопвеа Ь) ( гетигп а < Ь ? Ь : а; Тпе шайп() ( шах<с)оиЬ1е> (1. О, -3. О) з // Явное указание аргументов // шаблона // Неявный вывод типа боиЬ1е // лля аргументов шаблона // Явное задание <1пе> подавляет // выводу следовательно, // результат имеет тип 1пс шах(1.0, -.3.0); шах<1пс>(1.0, 3.0); сешр1асе<сурепате Рвет, сурепаше вгст> 1п11пе пвст 1шр11стс сазе(згст сопзса х) Некоторые аргументы шаблона невозможно получить путем вывода (см.

главу 11, Вывод аргументов шаблонов" ). Соответствующие параметры лучше помещать в начале ~писка параметров шаблона с тем, чтобы их можно было задать явно, а остальные получить путем вывода, // с)еса11в/Тшр11сге.срр 130 Глава 8. Вглубь шаблонов ( // ЯгсТ выводится, а Ввгт — нет гесигп х; ) Тпг вайп() ( йоиЬ1е ча1ие = 1вр11сйс савс<йоиЬ1е>(-1); ) Если в данном примере изменить порядок следования параметров шаблона (другими словами, если написать Севр1асе<гурепаве ЯгсТ, Сурепаве ))вСТ>), оба аргумента шаблона в вызове 1вр11сйп санЕ нужно будет задавать явно. Поскольку шаблоны функций могут быть перегружены, явного указания всех аргументов шаблона функции может оказаться недостаточно для идентификации конкретной функции: в некоторых случаях таким образом задается семейство функций.

В приведенном ниже примере иллюстрируется следствие из этого наблюдения. Гевр1аге<сурепаве Рипс, Сурепаве Т> чо1й арр1у (Рипс йипс рсг, Т х) ( йипс рсг(х); ) Севр1аге<гурепаве Т> чойй в1пд1е(Т) Севр1аге<гурепаве Т> чо1й ви1Г1(Т); Севр1аге<гурепаве Т> чо1й ви1С1(Т*) Тпс вайп() ( арр1у(ав1пд1е<1пс>,3)> // ВЕРНО арр1у(йви1с1<1пс>,7); // ОШИБКА: нет единственной // ви1г1<1пс> В этом примере первый вызов арр1у() корректен, поскольку тип выражения ав1пд1е<йпс> является недвусмысленным. В результате значение аргумента шаблона для параметра Рипс легко получается путем вывода. Однако во втором вызове йви1с1<1пс> тип может быть одним из двух разных типов, а следовательно, в данном случае Рипс нельзя получить путем дедукции.

Более того, явное указание аргументов шаблона функции может привести к попытке сконструировать неверный тип С++. Рассмотрим следуюший перегруженный шаблон функции (КТ1 и КТ2 являются неопределенными типами): Севр1асе<гурепаве Т> КТ1 Гена(сурепаве Т::Х сопвс*); севр1аге<сурепаве т> кт2.кеес(...); Выражение севс<1пг> для первого из двух шаблонов функций не имеет смысла, поскольку у типа 1пс нет типа-члена х. Однако для второго шаблона такая проблема от- 8.3 Аргументы шаблонов сугствует. Следовательно, выражением ьгевс<йпг> задается адрес единственной функции. Однако из-за того, что подстановка зпс в первом шаблоне невозможна, это выражение не становится некорректным.

Очевидно, что принцип "неверная подстановка не является ошибкой" (апЬзйибоп(а((пге-(в-помап-епог — Зг(МААЕ) представляет собой важную составную часть практического применения перегрузки шаблонов функций. Благодаря этому принципу становится возможным замечательный прием, используемый при компиляции. Например, предположим, что типы кТ1 и кТ2 определены следующим образом: суре<)ей сЬаг дТ1; сурес)ег вггисс (сьаг а[2)з ) кт2; Во время компиляции (другими словами, используя так называемое константное выра- жение) можно проверить, имеет ли данный тнп Т тнп-член Х.

№деййпе суре Ьав шешЬег суре Х(Т) (взгеоб (Севе<Т> (О) ) == 1) Чтобы понять выражение в этом макросе, удобно анализировать его снаружи внутрь. Прежде всего, выражение вйхеой будет равно 1, если выбран первый шаблон сева (который возвращает сЬаг с размером 1). Второй шаблон возвращает структуру с размером по меньшей мере 2 (поскольку она содержит массив с размером 2). Друп~ми словамн, мы имеем конструкцию, пспволяющую на основе константного выражения определить, какой нз шаблонов — первый нли второй — был выбран для вызова функции Севг<Т> (О) .

Очевидно, что если данный тип Т не имеет тнпа-члена Х, то первый шаблон не мог быть выбран. Однако, если данный тнп имеет тнп-член Х, выбирается первый шабюн, поскольку при распознавании имени перегруженной функции по типам ее параметров (см. приложеннеБ, 'Разрешение пере~рузки") предло пение отдается преобразованию от нуля к константе, соответствующей нулевому указателю, а не привязке аргумента к параметру-троеточню (такие паРаметры являкпся самым слабым видом связывания в аспекте распознавания имени перегруженной функции по типам ее параметров). Анаюгичная меюдика используется в главе 15, "Классы свойств и стратсгнй".

Принцип "неверная подстановка не является ошибкой" защищает только от создания неверных типов, но не от вычисления неверных выражений. Следовательно, приведенный ниже пример неверен. Сешр1асе<1пг 1> чоЫ й(йпс (й) [24/(4-1)1) ' сешр1аге<йпс 1> чо1<1 й (Тпс (ь) [24/ (4+1) 1); 1пс шайп () ( ( акт<4>; // Ошибка: деление на нуль (принцип // ЯРХЫАЕ не применяется) Этот код является ошибочным, несмотря на то что за счет второго шаблона обеспечивается подстановка которая ие приводит к делению на нуль. Ошибки такого рода про- 132 Глава 8.

Вглубь шаблонов исходят в самих выражениях, а не при связывании выражения с параметром шаблона. Следующий пример вполне корректен: гешр1аге<йпг Б> йпс д() ( гегцгп Б; Гешр1асе<тпс* Р> йпс д() ( гесигп *Ру] тпг. шайп() гееигп д<1>(); // 1 не может быть привязана // к параметру йпг*.

) // Применим принцип ЯРХНАЕ Другие примеры применения принципа Зг1МАЕ вы найдете в разделах 15.2.2, стр. 293, и 19.3, стр. 376. 8.3.2. Аргументы типов Аргументы типов шаблона являются "значениями", которые указываются для параметров типов шаблона. В качестве аргументов шаблона могут выступать почти все обычно используемые типы„но есть два исключения. 1. В число аргументов типов шаблонов не могут входить локальные классы и перечисления (другими словами, типы, которые объявляются в определении функции). 2. Аргументами шаблонов не могут быть типы, которые включают неименованные типы класса или неименованные типы перечислений (однако аргументами шаблона могуг быть неименованные классы или перечисления, которые получают имена с помощью объявления суре<)ей).

Эти два исключения иллюстрируются в приведенном ниже примере. гешр1аге <гурепаше Т> с1авв Ывс ( гурейей вегасе ( допЫе х, у, в; ) Ротпс; Гуре<)ей ерш ( гес(, дгееп, )з1ие ) *Оо1огРГгу тпг шайп () ( вггпсс Аввостаетоп ( ( 1пс* Р; йпс* д~ Ыве<Аввосаг1оп*> еггог 1; // Ошибка: локальный тип 8.3. Аргументы шаблонов 133 // в аргументе шаблона // Ошибка: неименованный тип // в аргументе шаблона // ВЕРНО: неименованный тип // класса, именованный при // помощи сурес)ей Ь1вг<Со1огРСг> еггог2; Ейвг<Ройпе> о)с; При использовании в качестве аргументов шаблона других типов, их подстановка вместо параметров шаблона должна приводить к корректным конструкциям. сешр1аге <Сурепаше Т> уоЫ с1еаг (Т р) ( *р = 0; // Требуется, чтобы к Т была применима // унарная операция разыменования ) Тпс ша1п() ( 1пц а; с1еаг(а); // ОШИБКА: для Тпс не поддерживается // унарная операция разыменования 8.3.3. Аргументы, не являющиеся типами ° Другой параметр шаблона, не являющийся типом и имеющий верный тип.

° Значение константы времени компиляции с целочисленным типом или типом перечисления. Это справедливо только в случае, когда параметр имеет тип, соответствующий типу этого значения (или типу, к которому оно может быль неявно преобразовано: например, тип с)заг допускается для параметра с типом Тпс). ° Имя внешней переменной или функции, которой предшествует встроенный унарный оператор й (получение адреса). Для переменных функций и массивов й можно опускать.

Такие аргументы шаблона соответствуют не являющимся типом параметрам с типом указателя. Аргументы того же вида, но не предваряемые оператором а, являются корректными аргументами для не являющихся типом параметров ссылочного типа. ° Константный указатель на член класса, другими словами, выражение вида аС:: ш, где С вЂ” тип класса, а ш — нестатический член класса (данные или функция). Такие значения соответствуют только не являющимся тицом параметрам с типом указателей на член класса. Не являющиеся типами аргументы шаблона представшнот собой значения, которые подставляются вместо не являющихся типами параметров.

Характеристики

Тип файла
DJVU-файл
Размер
5,6 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

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