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

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

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

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

Один из методов, иногда применяемых в подобной ситуации, состоит в том, чтобы объявить шаблон в виде специализаций во всех единицах трансляции (что сделает невозможным автоматическое инстанцирование этой специализации), за исключением той, в которой данная специализация инстанцируется явным образом. Чтобы проиллюстрировать этот подход, модифицируем предыдущий пример, включив в нем определение шаблона в единицу трансляции 1. // Единица трансляции 1з Сещр1апе<пурепаще Т> чойд б() ) сещр1асе<> чо16 б<1пс>(); // Объявление без // определения уо1с) д() ( 1<1пс> ( ); ) ный переносимый способ обеспечить такой запрет — поместить определение шаблона только в той единице трансляции, в которой этот шаблон будет явно инстанцирован.

)(),5. Явное инстанцирование 189 // Единица транолнции 21 сешр1аье<сурепаще Т> чо1Й й() ( ) гешр1асе чойг) б<1пс>() 1 // ручное инстанцирование чоЫ д(); 1пс цафп() ( д(); ) К сожалению, при этом предполагается, что объектный код для вызова явно заданной специализации идентичен вызову подходящей обобщенной специализации. В некоторых случаях это предположение неверно.

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

как показано ниже. // Единица трансляции 15 Сещр1апе<пурепаще Т> чофг) б() ( ) ехьегп сешр1асе чойд б<1пс>() 1 /l Объявление // без определения т016 д() ( б<1пс> () ) 15 Скорректированное имк функции — это нмя, с которым работает компоновщик: В ием ьбычное имя функции сочетается с атрибутами ее параметров, аргументов шаблона, а иногда и с другими свойствами. В результате получается уникальное нмя, даже если данная функция пере"Ружеиа Глава 10. Инстанцирование 10.6.

Заключение Эта глава посвящена двум взаимосвязанным, но разным вопросам. "моделям компиляции шаблонов и различным механизмом инстпнцирования шаблонов в С++. Модель компиляции определяет смысл шаблона на различных стадиях транслирования программы. В частности, она определает значение различных конструкций шаблона в процессе его инстанцирования.

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

В ней создавались новые единишя трансляции для инсганцирования шаблонов с помощью особых соглашений, касающихся организации исходных файлов. Получаемые в результате единицы трансляции компилировались с помощью модели, которая, по сути, была моделью включения (хотя правила поиска имен С++ в то время были существенно иными). Несмотря на то что в компиляторе С(гонг не была реализована модель "раздельной компиляции" шаблонов, он создавал видимость раздельной компиляции с помощью неявных включений. Разнообразные последующие реализации использовали аналогичный механизм неявного включения по умолчанию (компания Бип М)сгозузгепв) или в качестве одной из доступных возможностей (НР, НХ)).

Тем самым достигалась определенная совмеспвюсть с имеющимся в наличии кодом, разработанным для компилятора СГгопь Приведем пример, иллюстрирующий особенности, присущие компилятору Сйопь // Файл семр1асе.Ьрр: СЕШР1асе<с1авв Т> // В компиляторе Сйкопт нет // ключевого слова Сурепке чойс) б(Т): // Файл Еемр1асе.орр: Сешр1аке<с1авв Т> // В компиляторе Сбгопк нет // ключевого слова Сурепахае Тс) б(Т) ) // Файл арр.Ьрр: с1авв АРР ( // Файл ма5.п срр: Вйпс1ис)е "аРР.)зРР" )0.6.

Заключение ()1пс1пс)е "Сезпр1асе.)зрр" 1пс пайп() Арр а; й(а); ) Во время компоновки компилятором Сигов( используется итеративная схема инстанцирования, после чего создается новая единица трансляции, включающая файлы, которые могут содержать реализации шаблонов, найденных в заголовочных файлах. В компиляторе С)гоп( принято соглашение, согласно которому расширение заголовочных файлов .)т (или аналогичное) заменяется расширением . с (или другим, например . С или . срр). При этом сгенерированная единица трансляции приобретает следующий вид: )/ Файл ва1зз.срр: $1пс1пс)е "севр1асе.)зрр" Мйпс1ис)е "сезор1асе.срр" ()1пс1иг)е "арр )трр" всас1с тго1Й Йппппу (Арр а1) ( б (а1); ) Затем полученная единица трансляции компилируется со специальными опциями, при которых отключается генерация кода каких бы то ни было объектов, определенных во включенных файлах. Благодаря этому предотвращается включение множественных определений подлежащих компоновке элементов, содержащихся в файле Сешр1асе .

срр (который мог быль уже скомпилирован в другой обьектный файл). Функция г)пляпу используется для создания ссылок на специализации, которые необходимо инстанцировать. Обратите внимание на изменение порядка заголовочных файлов. Оно объясняется тем, что в состав компилятора С)гоп( входит код, анализирующий заголовочные файлы. Благодаря ему заголовочные файлы, которые не используются в оперируемой единице трансляции, опускаются.

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

~сопельку этот процесс не основан на включении, он не требует специальных соглаше"нй для заголовочных файлов, а наличие определений макросов в одной единице транс"яцни не может повредить другим единицам трансляции. Однако, как было описано в этой главе, преполносить сюрпризы в С++ способны не только макросы, поэтому модель экспортирования подвержена и другого рода неприятностям. Глава 11 Вывод аргументов шаблонов Если при каждом вызове шаблона функции явным образом задавать аргументы шаблона (например, сопсас<вМ::всгйпд,йпс>(в,З)), то код может быстро стать громоздким.

К счастью, компилятор С++ часто в состоянии автоматически определить, какими должны быть аргументы шаблона. Это достигается с помощью мощного механизма под названием вывод аргументов шаблона ((ешр)а(е агяшпеп( бебпсйоп). В настоящей главе подробно объясняется, что происходит в процессе вывода аргументов шаблонов. Как это часто бывает в С++, с этим процессом связано множество правил, соблюдение которых обычно приводит к интуитивно понятному результату. Глубокое понимание материала, изложенного в этой главе, позволит избежать многих досадных неожиданностей. 11.1.

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

Рассмотрим пример. семр1апе<пурепаше Т> Т сопвка шах(Т сопнсй а, Т сопвпа Ь) ( гесигп а < Ь ? Ь : а; 1пс д = шах(1, 1.0)' В вызове функции шах () первый аргумент принадлежит типу Тпе, из чего можно заключить, что в роли параметра Т в исходном шаблоне шах ( ) должен выступать тип 1пш Однако второй аргумент принадлежит типу с)оиЬ1е, а это означает, что вместо паРаметра типа Т нужно подставить тип с)оиЬ1е. Этот вывод противоречит предыдущему. 194 Глава 11. Вывод аргументов шаблонов Заметим, что утверждение "вывод выполнить не удаегся" не означает, что программа некорректна.

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

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

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

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