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

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

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

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

Применение шаблонов на практике // ОШИБКА: невозможно явно инстанцировать // функцию-член класса, который уже // инстанцирован сетр1асе ЯсасК<хпс>::ЯсасК(); В программе должно быть не более одного явного инстанцирования для каждого отдельного типа. Другими словами, можно явно создать экземпляры как для рг1пс суреой<зпс>, так и для ргзпс суреой<г)оцЫе>, но каждая директива должна быть включена в программу только один раз.

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

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

И наконец, для некоторых приложений может оказаться полезной возможность контролировать точное местоположение (т.е. обьектный файл) экземпляра шаблона. При автоматическом инстанцировании шаблонов это невозможно (более подробно данный вопрос рассматривается в главе 10, "Инстанцирование"). 6.2.2. Сочетание модели включения и явного инстанцирования Чтобы программист мог выбирать, когда использовать модель включения, а когда явное инстанцирование, можно отделить объявления и определения шаблонов, поместив их в два разных файла.

На практике эти файлы обычно именуются как заголовочные (с использованием расширений, применяющихся для таких файлов). Таким образом, файл щуйагвс. срр из нашего примера получит имя шуНгвсс)ей. )трр. На рис. 6.1 это проиллюстрировано на примере шаблона класса Я сасК<>. б З. Модель разделения Рис. б. й Разделение объявления и определения шаблона Таким образом, если потребуется использовать модель включения, можно просто включить в код заголовочный файл веас~сбей.

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

Однако этот же стандарт обеспечивает альтернативный механизм зксворта шаблонов. Такой подход иногда называют моделью разделения шаблонов С++. Глава б. Применение шаблонов на практике 90 ц Вгпсгцде "всасидет Ьрр В1пс1цде <вгг1пд> сопвга) Ф~' ',1<>>1л<л."."4~'.4У4Ыч(ъбь~в*.хввк() '"",мР~';;%'" -',>)~!Ф':.=е/~~$(/4%в/!~~туг'ц$/) ';1г>А)>>4ЬВ)д~)(>"',"$" 6.3.1. Ключевое слово ехрогя В принципе использовать экспорт очень легко. Для этого нужно определить шаблон только в одном файле и пометить его определение и все обьявления, не являющиеся определениями, ключевым словом ехроге. Для примера из предыдущего раздела будет получено следующее объявление шаблона функции: // Ьавгсв/шуйзгвСЗ.Ьрр №ййпйей МХР1КЯТ НРР №дебйпе МХР1йЯТ НРР // Объявление шаблона ехрогс // инстанцирование класса ягаск<> для гпс Гевр1асе Ясасн<(пс>) // Инстанцирование некоторых функций-членов // ягаси<> для строк Геир1асе Ясаси<всд::всг(пд>::Ясасг()) Гевр1асе чоьд Ясаси<всд::всгьпд>::рцвц(всд::всггпд гевр1аге вод::вгггпд ягаск<вгд::вгггпд>:;сор(); Рис.

б.2. Явное инстанцирование с иснолвзованием двух заголовочных файлов цг н )ц). 6.3. Модель разделения 91 сеазр1аге <Сурепазае Т> чоЫ рг1пс суреоб(Т сопвса)) ()еп61Й // НУР1КЯТ НРР Экспортируемые шаблоны можно использовать без обязательной видимости их определений. Другими словами, место, где шаблон используется, и место, где он определяется, могут находиться в двух разных единицах трансляции.

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

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

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

ехрогг Гетр1аге <Сурепазае Т> с1авя МуС1аев риЫ1с: чо16 заевйип1(); // Экспортируется чо16 тетйип2() ( // Не экспортируется, // поскольку является неявно // встраиваемой ) чоЫ шетбипЗ (); // Не экспортируется, // поскольку является явно // встраиваемой Гевзр1аге <Сурепаве Т> 92 Глава 6.

Применение шаблонов на практике Тп11пе чоЫ МуО1азз<Т>:зшешбппз() ( Заметим, что ключевое слово ехрогс нельзя сочетать с Тп11пе и оно должно предшествовать ключевому слову сепзр1асе. Приведенный ниже код некорректен. Сепзр1аее <Сурепате Т> с1азз 1пча1Ы ( рпЬ11с: ехрогс чозЫ ыгопд(Т); // ОШИБКА: за ехроге не // следует сегпр1асе ехроге Сеп!р1аее <Сурепаме Т> Тп11пе чоЫ Хпча11с)<Т>з!мгопд(Т) ( // ОШИБКА! ехрога // и Тп11пе одновременно ехрогс 1п11пе Т сопзкй и!ах (Т сепией, Т сепией Ь) // ОШИБКА: ехроге и зп11пе одновременно геспгп а < Ь 7 Ь : аг 6.3.2.

Ограничения модели разделения ! Насколько пам известно, это Ед!зоп Рез!Вп Огопр, )пс. (ЕОО) [)я]. Кстати, их технология доступна через прслувты других производителей. Наступил момент, когда читатель вправе спросить: почему же авторы так горячо пропагандировали модель включения, если существует такое волшебное средство, как экспорт шаблонов? Тому существует несколько объяснений. Во-первых, даже по прошествии четырех лет после принятия стандарта только одна компания смогла реально реализовать поддержку ключевого слова ехрохс .

Следова! тельно, опыт работы с этим ключевым словом не получил такого широкого распространения, как в случае других средств языка С++. Кстати, это означает еще и то, что все наши выводы основаны только на небольших крупицах опыта. Во-вторых, хотя экспорт может показаться почти волшебным средством, в действии!ельиости это средство панацеей от всех бед не является. В конечном счете в процессе инстанцирования шаблона задействовано как место, где генерируется экземпляр шаблона, так и место, где находится его определение. Следовательно, хотя на первый взгляд оба места в исходном коде разнесены, тем не менее между ними существует невидимая связь, которую система создает "за кулисами". Это означает, например, следующее: если файл, содержащий определение, изменяется, то должны быть перекомпилированы как 6.3. Модель разделения 93 сам измененный файл, так и все файлы, связанные ним. По существу, получена почти та же модель включения, хотя она не так очевидно просматривается в исходном коде.

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

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

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

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

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

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

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