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

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

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

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

° Шаблонные версии операторов присвоения не заменяют операторы присвоения по умолчанию. ° Шаблоны классов можно использовать в качестве параметров шаблона — это так называемые шаблонные параметры шаблонов. ° Длл шаблонных параметров шаблонов должно выполвпъся точное соответствие. Зна- чения аргументов по умолчанию для шаблонных параметров шаблона ипюрируются. ° Явный вызов конструктора по умолчанию гарантирует инициализацию переменных и членов шаблонов значением по умолчанию, даже если эти шаблоны инстанцируются со встроенными типами.

° Для строковых литералов преобразование массива в указатель в процессе вывода ар- гументов имеет место тогда и только тогда, когда параметры не являются ссылками. Глава 6 Применение шаблонов на практике Код шаблонов имеет некоторые отличия от обычного кода. В грубом приближении шаблоны можно поместить где-то между макросами и обычными (нешаблонными) объявлениями. Это, разумеется, не более чем упрощение, но оно имеет следствия не только лля способов написания алгоритмов и структур данных, в которых используются шаблоны, но и для логики представления и анализа программ, включающих шаблоны.

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

В данном разделе представлен наиболее популярный на момент написания этой книги подход— модель включения. 6.1.1. Ошибки при компоновке Большинство программистов, работающих на С и С++, как правило, предпочитаот следующий способ организации нешаблонного кода: ° классы и другие типы полностью помещаются в заголовочные фпйяы; обычно это файлы с такими расширениями, как . )зрр (или . Н, . Ь, . )зЬ, . Ьхх); ° при использовании глобальных переменных и (невстраиваемых) функций в заголовочный файл помещаются только объявления, а определения — в так называемый .С-файл", это обычно файлы с расширением .

срр (. С, . с, . сс, . схх). Описанная схема хорошо себя зарекомендовала на практике: во-первых, при ее использовании необходимые определения типов легко доступны всей программе, а во- 84 Глава 6. Применение шаблонов на практике вторых, она позволяет исключить ошибку дублирования определений переменных и функций компоновщиком.

Рассмотрим распространенную ошибку, которую часто допускают программисты, начинающие работать с шаблонами. Эта ошибка проиллюстрирована с помощью приведенного ниже (ошибочного) программного кода. Шаблон, как это часто делается для "обычного кода*', обьявляется в заголовочном файле. // Ьав1св/туй1гзг.йрр 81йпс)ей МУР1КЯТ НРР ()с)ей1пе МУР1КЯТ НРР // Объявление шаблона Сетр1аге <Сурепате Т> чоЫ ргфпг Суреой (Т сопвгй) ()епЖЙ // МУР1КЯТ НРР Здесь рг1пс суреой() представляет собой объявление простой вспомогательной функции, предназначенной для вывода некоторой информации. Реализация этой функции помещается в .С-файл.

// Ьавфсв/тубфгвс.срр ()1пс1исе <1озсгеат> ()1пс1цде <суре1пбо> ()1пс1цс)е "туй1гзг.йрр" // Реализация/определение шаблона сетр1аге <Сурепате Т> чоЫ ргфпс Суреоб (Т сопвга х); ( вес)::соцс «суре1с((х) .пате() «всс)::епс)1; ) В этом примере для вывода строки описания типа передаваемого выражения используется оператор Суре1д (см. раздел 5.6, стр. 79). И наконец, шаблон используется в другом .С-файле, в который объявление нашего шаблона включено с помощью директивы () 1пс1цс)е. // Ьаз1сз/туНгвкша1п.срр ()1пс1цс)е "туй1гвс.йрр" // Использование шаблона 1пс тафп() ( с)оцЬ1е 1се = 3.0р рг1пс суреой(1се); // Вызов шаблона функции // для типа боцЬ1е б ), Модель включения 85 Компилятор С++, скорее всего, воспримет приведенную программу без замечаний, „днако компоновщик выдаст сообщение об ошибке отсутствия определения функции ,гхпс пУРеой().

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

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

6.1.2. Шаблоны в заголовочных файлах Обычно описанная проблема решается с помощью того же подхода, что и применяемый для макросов или для встраиваемых функций. Другими словами, определения шаблона включаотся в заголовочный файл, в котором объявляется этот шаблон. Чтобы сделать это для нашего примера, можно добавить в конце файла шуб з та с . )зрр директиву 81пс1цс)е "шуб1квс. срр" или включитыпуб1квс . срр в каждый .С файл, в котором используется шаблон. Существуег еще один способ: избавиться от шуйхквс . срр и переписать шуЕ1квс . )зрр так, чтобы он содержал все объявления и определения шаблонов. // Ьав1св/шу81квс2.)зрр ()1тпс)ет МУР1НЯТ НРР Вс)ей1пе МУГ1НЯТ НРР ()1пс1цс(е е1овскеаш> 81пс1цс)е <суре1пйо> // Объявление шаблона Сешр1ате еаурепаше Т> чоЫ рк1пс суреот(Т сопвса) 1 // Реализация/определение шаблона Сешр1аее <Сурепаше Т> чо1с( ркхпс суреоб(Т сопвса х) ( всй:: соцс «суре1с) (х) .

паше () «вес):: еп61 г Вепа1й // Муртцят НРР 8б Глава б. Применение шаблонов на практике Такой способ организации кода с шаблонами получил название модели включения (1пс!нз)оп шоде1). Легко убедиться, что теперь, после внесения правок, наша программа корректно компилируется, компонуется и выполняется. Здесь следует сделать несколько замечаний.

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

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

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

На практике все, как правило, корректно работает, и вы не должны вникать в эти вопросы. Однако в больших проектах, для которых создаются собственные библиотеки, могут возникать проблемы, справиться с которыми помогут схемы инстанцирования, рассматриваемые в главе 10, "Инстанцирование", и тщательное изучение документации к вашему компилятору С++. В заключение следует отметить: все, что говорилось относительно обычного шаблона функции в нашем примере, применимо также к функциям-членам и статическим данным-членам, а также к шаблонам функций-членов. 87 б 2, явное инстанцирование ~.2.

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

Пример явного инстанцирования шаблона Для того чтобы проиллюстрировать инстанцирование шаблона вручную, давайте вновь обратимся к нашему примеру, который приводил к ошибке при компоновке (см. раздел 6.1.1). Чтобы избежать ошибки, добавим в нашу программу приведенный ниже файл. // Ьавфсв/шуйсгвефпвс.срр ()1пс1цс)е "шуй1гве.срр" // Явное инстанцирование ргйпе курепов() // для типа г)оцЬ1е Сешр1асе чойг) ргфпс суреой<г)оцЬ1е>(доцЬ1е сонной) Директива явного инстанцнрования содержит ключевое слово сешр1асе, за которым следует объявление объекта, экземпляр которого необходимо сгенерировать, с полностью выполненными подстановками.

В нашем примере это делается для обычной функции, но явное инстанцирование шаблонов возможно и для функций-членов или статических данных-членов. // Явно инстанцированный констрУктор // МуС1авв<> для 1пе Сешр1аее МУС1авв<фпС>::МуС1авв(); // Явное инстанцирование шаблона функции шах() для 1пк сешр1асе 1пс сопвса шах(йпс сопвса, 1пс сопвса) Можно также явно инстанцировать шаблон класса, что, по сути, означает инстанцированне всех членов этого класса, для которых оно возможно. При этом исключаются члены класса которые предварительно были специализированы, а также уже инстанцированные. // Явное инстанцирование класса Яеас)< // для типа 1пе сешр1асе с1авв Баас)с<1пс>; // Явное инстанцирование некоторых функций-членов // класса деас)с<> для строк еешр1асе ясас)«всй:: всг1пд>:: ясас)с (); сешр1асе чоы Бсас)«вы::всг1пд>::рцвь(всб::всгспд сопвса) з сешр1асе вес(::всг1пд дсас)«все)::всг1пд>: гаор() з Глава 6.

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

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

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

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