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

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

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

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

Классификация типов ХзСХаввТ = ХвСХаввТ<Т>::Уев ); ВепйХЙ // ТУРЕТ НРР Приведенная далее программа демонстрирует применение шаблонов классификации типов. // .курев/курев.срр ()ХпсХийе "гурес.Ьрр" ()ХпсХис(е <Ховегеаш> сХавз МуСХазв ( ); чоХс( шуйипс() ( епиш Е ( е1 ); // Проверка путем передачи типа в качестве аргумента шаблона СетрХаге<сурепаше Т> чоЫ сЬес)<() ( Хй (Турет<Т>::ХзрипийаТ) вес)::соис « " ХзрипйаТ ) Хй (ТуреТ<Т>::ХзркгТ) всй::соиг « " ХвРЕгТ ) Хй (ТуреТ<Т>::Ханей) ( всс)::соис « " ХзнейТ ) ХХ (ТуреТ<Т>::ХзАггауТ) ( вес(::соис « " ХзАггауТ Хй (Турет<Т>::Хврипст) ( вЫ::соис « " 1зрипсТ ) Хг (ТуреТ<Т>::ХвРЕгМешТ) ( вей::соиг « " ХвРсгмешТ Хй (ТуреТ<Т>::1вЕпшаТ) ( вела::соне « " ХвЕпшаТ Хй (ТуреТ<Т>::1зСХаввТ) ( вгй::соие « " 1вСХаввТ ) 19.6. Окончательное решение вой::соиг « вой::епй1; ) // Проверка путем передачи типа как аргумента функции еетр1аее<еурепшае Т> чо?й с?тесКТ(Т) с)тесК<Т> ( ) // 1(ля указателей определяем, на что они указывают 18 (ТуреТ<Т»:ТзРегТ [[ ТуреТ<Т>:ьгзРЕгМеп(Т) ( с?тесК<еурепаше СоыроипйТ<Т>::ВавеТ>(); ) Тпе ва?п() ( вгй::соие « "Тпг:" « вой::епй1? сЬесК<1пе>()? вей::соиг « "1пга:" « вой::епй1; сЬесК<1пгй>(); вой::соиг « "с?таг[42):" « зей::епй1; с?тесК<с)таг[42]>()? вой::соиг « "МуС1авв:" « вой::епй1( сЬесК<МуС1авв>()( вой::соиг « "рог ео епиш:" « вой::епй1? е*.рог = О; с)тесКТ(рог)> вой::соиг « "42:" « вой::епй1? с?тесКТ(42)> вой::соие « "?вуЕипс():" « згй::епй1? с?тесКТ(?ауйипс)( вой::соие « "?аежрег ео аггау:" « вой::епй1? сЬаг (МуС1азв::*шеюргг)[] О; с?тесКТ(те?аргг)( Приведем вывод данной программы.

Тпрр.: Хврипйат 1пеа: 1вкейТ сЬах [42): Глава 19. Классификация типов 386 18АггауТ МуС1авв: 1вС1аввТ рсг со епщв: 1вРСгТ 1вЕпшъТ 42: 1вРцпс)аТ туйппс ( ): 1врсгТ 1врппсТ шетргг со аггау: 1вРСгМетТ 1вАггауТ 19.7. Заключение Возможность программы проверять свои собственные высокоуровневые свойства (например, структуры типов) иногда именуют рефлексией (гейесйоп). Таким образом, рассмотренная в этой главе схема представляет собой не что иное, как рефлексию времени компиляции — технологию, родственную металраграммираванию (см. главу 17, "Метапрограммы").

Идея хранения свойств типов в виде членов специализаций шаблонов датируется примерно срединой 1990-х годов. Среди ранних серьезных приложений шаблонов классификации типов следует упомянуть шаблон суре сгайсв в реализации 8ТЬ от 801 (ныне известной как Ей)соп Отар)з!сз).

Шаблон ЯО! предназначался для представления некоторых свойств своего аргумента. Эта информация затем использовалась при оптимизации ряда алгоритмов БТЬ для данного типа. Интересной особенностью решения 801 стало то, что некоторые компиляторы ЯО! распознавали специализации суре сгайсв и обеспечивали информацию о его аргументе, которую нельзя было вывести с помощью стандартных методов (обобщенная реализация шаблона суре сгайсв не оптимальна, но вполне безопасна при использовании).

Возможность использования принципа ЯНМАЕ для классификации типов была отмечена при его уточнении в процессе стандартизации языка. Однако этот принцип никогда не был формально документировал, в результате позже была затрачена масса усилий на повторную разработку описанных в этой главе методик. Один из наиболее значительных вкладов был внесен Андреем Александреску (Апдге) А)ехалдгезсв), который использовал оператор вйгеой для определения результата разрешения перегрузки. И наконец, следует отметить, что более полный шаблон классификации типов можно найти в библиотеке Воом (8]. В свою очередь, эта реализация служит основой для добав пения возможностей такого рода в стандартную библиотеку (см.

также разлел 13 1~ стр. 243, о соответствующих языковых расширениях). Глава 20 Интеллектуальные указатели Память представляет собой ресурс, с которым программы на С++ обычно работают явным образом. Эта работа включает в себя получение и освобождение блоков памяти. Один из наиболее тонких вопросов управления динамически выделенной памятью связан с тем, когда она должна быть освобождена.

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

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

Интеллектуальные указатели, реализующие эту политику, полезны при генерации исключений во время работы с динамически выделенными объектами. ° Разделяемое владение может иногда приводить к исключительно сложным ситуациям, связанным со временем жизни объекта. В таких случаях может оказаться разумным передать решение вопросов времени жизни объектов от программиста программе. Термин интеллектуальный указатель означает, что имеется объект, на который он Указывает. Альтернативы для указателей на функции рассматриваются отдельно, в главе 22, "Объекты-функции и обратные вызовы". 20.1. Но16ег и Тпйе В этом разделе рассматриваются два типа интеллектуальных указателей: Ьойзег (дословно — лержатель, хранитель), предназначенный для исключительного хранения объекта, и так называемый гги)е (от пвпзбег сараи)е — оболочка передачи), предназначенный для передачи владения от одного держателя другому.

Глава 20. Интеллектуальные указатели 388 20.1.1. Защита от исключений Исключения были введены в С++ для повышения надежности программ. Они позволяют более четко отделить обычный путь выполнения от некоторого исключительного пути, Буквально сразу же после введения исключений в С++ многие замепши, что бездумное использование исюпочений приводит к неприятностям, в частности к утечке паияти. Приве. дем пример, показывающий одну из множества возможных неприатных ситуаций. чо1с) с)о воаеСМпд() ( Яоаег)зйпд" ргг = пен ЯоаеСМпдг // Выполняем некоторые действия с рог рсг->регбога(); с)е1есе рггз В данной функции с помощью оператора пеи создается объект, над ним выполняются некоторые операции, после чего он уничтожается с помощью оператора г)е1есе.

К сожалению, если после создания объекта, но до его удаления могут случиться всякие неприятности и будет сгенерировано исключение, то занимаемая объектом память не будет освобождена, т.е. мы получим тривиальную утечку памяти. Вторая проблема состоит в том, что так и не будет вызван деструктор объекта (например, буферы не будут записаны на диск, сетевое подключение не будет освобождено, окно не будет закрыто и т.д.). Данная конкретная проблема решается с помощью явного обработчика исключений. чо16 с)о аоаес)зйпд() ( ЯоаесМпд* рог Ог агу ( ргг = пеи Боаес)зйпд; // Выполняем некоторые действия с рог рсг-ьрегйога(); сакс)з(...) ( с)е1еге рсгг с)згонг // Передача исключения с)е1есе рггг Это вполне приемлемое решение, но даже в таком простейшем случае видно, что ис ключнтельный путь выполнения начинаег главенствовать над обычным н удаление обь екта происходит в двух различных местах — как в обычном пути выполнения, так и в 20.1. Но!оег и Ттц!е 389 исключительном.

Это решение с усложнением функции становится все хуже и хуже. Рас- смотрим, что произойдет, если в функции будут создаваться два объекта. зтоЫ с)о сыо СМпдв() ( Яошес)з1пд* гйгвс = пеы Яошес)тйпд! г1гвг->регйогш()! Яошес)зйпд* весопс) = пезг ЯошесМпд! весопд ->реггогш()! с)е1есе весопс)! с)е1есе гйгвс! Использовать явный обработчик исключений можно различными способами, но все они выглядят не очень привлекательно.

Приведем один нз вариантов. чоЫ с)о сыо с)зйпдв() Яошес)зйпд* Нгвс = О; Яошес)зйпд* весопс) = О; 'сгу ( ййгвс = пеы яошег)зйпд! ййгве->реггогш(); весопс) = пезт Яошес)зйпд! весопс) ->реггогш(); ) сакс)з(... ) ( Йе1есе весопс)! де1есе Игвс! с)згозт! у/ Передача исключения ) с)е1рсе весопс)! с)е1есе гйгвс) Здесь предполагается, что оператор с)е1есе не генерирует исключений .

В данном примере код обработчика исключений представляет собой существенную часть программы, но можно показать (и это гораздо важнее), что он становится к тому же наиболее тонким ее местом. Кроме того, требования безопасности исключений приводят к существенному изменению обычного пути выполнения программы. ! Это вполне Разумное предлоложевие. деструкторов, которые могут генерировать нсключеввя, слелует избегать, поскольку деструкторы автоматически вызываются цри генерации исключений и в втой ситуации генерация новою исключения приведет к немедленному аварийному завершению программы. Глава 20. Интеллектуальные указатели 390 20.1.2. Н016ег К счастью, не так уж трудно написать небольшой шаблон класса, который инкапсулирует стратегию второго примера. Идея состоит в том, чтобы написать класс, который ведет себя подобно указателю, но при этом уничтожает объект, на который указывает, при уничтожении самого указывающего объекта или прн присвоении ему другого указателя.

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

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

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

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