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

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

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

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

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

С типом могут быть связаны константы и другие классы значений. Глава 15. Классы свойств и стратегий 278 Наш исходный шаблон ассшп() использует конструктор по умолчанию, возвращающий значение для инициализации переменной-результата с тем, чтобы она приняла значение, аналогичное нулевому. АссТ Сога1 = АссТ(); // Предполагаем, что Аост()создает // нулевое значение гегигп госа1; Разумеется, нет никакой гарантии того, что этот код обеспечивает подходящее значение, необходимое для запуска цикла накопления. Ведь тип Т может даже не иметь конструктора по умолчанию.

Но и в этом случае классы свойств могут спасти ситуацию. В данном примере можно добавить к нашему классу Ассшпи1агйопТгайсв новое свойство значение (тз)ое пй(). // сга1гв/ассшпггайгвЗ.Ьрр Гевр1аее<гурепагпе Т> с1авв Ассшпи1асйоптгайсв; сешр1асе<> с1авв Ассшпи1аейоптгайсв<с)таг> ( риЫТс: Сурес)ей 1пе АссТ; всаейс АссТ солне лего = О; гешр1аге<> с1авв Ассшпи1агйопТга1пв<в)тоги> ( риЫ1с: Сурес)ей 1пк АссТу Всас1С АССТ СОПВГ ХЕГО = О; гешр1асе<> с1авв Ассипи1асйопТгайсв<1пс> ( риЬ11с: Сурес)еб 1опд АссТ; всас1с АссТ сопвс лего = О; В представленном фрагменте кода нашим новым свойством является константа, которая может быть вычислена в процессе компиляции. Ниже показано, какой вид принимает при этом функция ассша() .

// сгайгв/ассшпЗ.Ьрр ()Таис)ей АСС(ПЧ НРР 15.1. Пример: суммирование последовательности ()йебйпе АСС(дя НРР ()1пс1ийе "ассищпгайсзЗ.ЬРР" 279 сещр1асе <гурепаще Т> 1п11пе сурепаще Ассшпи1аЫоптгайпв<т>::Асст ассшп(т сопзс* Ьед, Т сопзг* епй) ( // Возвращаемый тип является свойством типа элементов Гурейеб сурепке Ассищи1асйопТгайгв<Т>::АссТ Аост; Аост соса1 = Ассшпи1агйопТгайсв<Т>:гаего; мЬ11е(Ьед != епй) ( сога1 += *Ьед; ++Ьед; ) гегигп сога1; Мепййй // АССОМ НРР В данном коде инициапизация переменной для накопления результата остается очень простой: АссТ Госа1 = Ассшпи1аг1опТгайгз<Т>::аего; Пещр1апе<> с1азв Ассищи1аЫопТгайсз<Й1оаг> ( РиЫ1с: Сурейеб йоиЬ1е АссТ; вгаг1с йоиЫе сопвг зего = 0.0; // ОШИБКА: не целочисленный тип Простейший альтернативный способ состоит в том, чтобы не определять свойство- значение в классе.

пещр1аге<> с1азв Ассшпи1асйоптгайсв<б1оаг> ( РиЫ1с: Недостаток этого способа состоит в том, что С++ позволяет инициализировать статический константный член-данные внутри класса, только если он имеет целочисленный или перечислимый тип. Это исключает возможность использования наших собственных классов, а также типов с плавающей точкой. Таким образом, представленная ниже специализация является ошибочной.

280 Глава 15. Классы свойств и стратегий сурет)ей с)сиЬ1е АссТ; всасйс ОоиЬ1е сопят кего; ); Инициализатор включается затем в исходный текст и выглядит примерно так: доиЫе сопят Ассшаи1агйопТгайсв<й1оаг>::гегс = 0.0; Хотя этот способ вполне работоспособен, он отличается меньшей "прозрачностью" для компиляторов. При работе с пользовательскими файлами компиляторам ничего не известно об определениях в других файлах.

В таком случае компилятор не способен, например, воспользоваться тем, что значение него на самом деле равно 0 . О. Следовательно, лучше реализовывать свойства-значения, которые не будут гарантированно целочисленного типа, в виде встраиваемых функций-членов . Например, класс Ассшни1агйопТгайсв можно записать так, как показано ниже. у I ггайгв/ассшцсга1св4. Ьрр Геьар1асе<сурепате Т> с1авв Ассицш1асйопТгайгв; сеьар1аге<> с1авв Ассшаи1асйопТга1св<сЬаг> ( риЫТс: сурес)ей Тпс АссТ; втакфс Аост хего() ( гегигп 0; ) гетр1асе<> с1авв Ассиюи1асйопТгайсв<вЬогг> ( риЫ ьс: Гурес)ей 1пс АссТ; вгагйс АссТ хего() ( гегигп 0; ) сеьцр1асе<> с1авв Ассшци1агйопТгайгв<йпг> ( риЫ ьс: Сурес)ей 1опд АссТ; всасйс АссТ кегс() ( 3 Современные компиляторы С++ могут эффективно онтнмнэнровать вызовы пРостых встраиваемых функций.

15.1. Пример:суммирование последовательности 281 гегигп О; сешр1асе<> с1авв Ассими1агйопТгайгв<ипвйдпее) Тпс> ( риЫТс: Сурег)ей ипвйдпег) 1опд АссТ; всас1с Аост кето() ( гегигп О; сешр1асе<> с1аве Ассиши1асаопТга1св<Й1оас> ( риЫТс: Сурег)ей 5оиЬ1е АссТ; всасйс АссТ яего() ( гегигп Оз В коде приложения при этом появляется единственное отличие — использование синтаксиса вызова функции вместо несколько более краткого доступа к статической переменной-члену класса.

АссТ гога1 = Ассиши1аг1опТга1св<Т>::гего()з Ясно, что свойства могут быль чем-то гораздо большим, нежели просто дополнительными типами. В нашем примере они могут играть роль механизма обеспечения функции ассиш() всей необходимой информацией о типе элемента, для которого она вызвана. В этом состоит ключевой момент концепции свойств, а именно: свойства обеспечивают средства настройки конкретных элементов (обычно типов) для обобщенных вычислений. 15Л.З. Параметризованные свойства Использование свойств в ассиш (), показанное в предыдущих разделах, называется фиксированным, поскольку, как только будет определен отдельный класс свойств, в алгоритме его будет нельзя переопределить; хотя бывают ситуации, когда такое переопределение желательно.

Например, может оказаться, что набор значений типа Т1оас виол"е можно суммировать в переменной этого же типа, а не бои)э1е; к тому же это приведет к некоторому повышению эффективности. В принсипе Решить эту проблему можно, добавив параметр шаблона со значением по Умолчанию, опрелеляемым нашим шаблоном свойств. Таким образом, в большинстве. случаев можно опустить дополнительный аргумент шаблона, а при необходимости легко изменить Глава 15.

Классы свойств и стратегий 282 тип переменной-накопителя. Единственная неприятность, сводящая все на нет, заключается в том, что шаблоны функций не могут иметь аргументы шаблона по умолчанию . Пока что обойдем проблему, представив наш алгоритм в виде класса. Тем самым будет заодно проиллюстрировано, что свойства могут использоваться в шаблонах класса по крайней мере так же легко, как и в шаблонах функций. Недостаток при использовании такого решения заключается в том, что шаблоны классов не могут иметь выводимые шаблонные аргументы, которые в результате должны быть указаны явно. Таким образом, для вызова функции нам придется использовать следующую запись: Ассиш<сЬаг>::ассов(апаше[0), йпаше[1епдГЬ)) А шаблон для суммирования значений будет выглядеть так, как показано ниже.

// сгайгв/асспш5.Ьрр №Тйпс?ей АСС(ДЧ НРР №с?ебзпе АСС(ЗМ НРР №Тпс1пс?е "ассишггайсв№.Ьрр" Гешр1асе <Сурепаше Т, сурепаше АТ = Ассшпи1ас1оптгайгв<Т» с1авв Асспзп ( риЬ11с: вгасйс Гурепаше АТ::АссТ ассша(Т сопвс*Ьед, Т сопвг*епс?) ( Гурепаше АТ::АссТ Сопа1 = АТ: евего(); мЬ11е(Ьед != епс?) ( гога1 += *Ьед; ++Ьед; ) ге?пгп госа1; №епЖй // АСС()И НРР Вероятно, большинству пользователей этого шаблона никогда не придется явно указывать второй параметр шаблона, поскольку его значение по умолчанию будет вполне их устраивать.

Как часто бывает в таких случаях, можно ввести для упрощения пару удобных в использовании встраиваемых функций. 4 Зт:а особенность почтк наверняка будет учтена при пересмотре станларта С++ а Разработчика компилятоРов, вероятно, оснастят свои изделия аозможносп ю использования аРгументов шаблоноа фунюшй по умолчанию лаже раньше, чем будет пересмотрен стандарт (см.

Разлел 13.3, стр. 233). 15.1. Пример: суммирование последовательности 283 Севр1аге <Сурепаве Т> Тп1хпе Сурепаве Ассшап1агтопТгайгв<т>::АссТ ассшл(Т сопит* Ьед, т сопле* епс)) ( геспгп Ассша<т>::ассша(Ъед, епй); Севр1аке <Гурепаве Тгатгв, Сурепазае Т> 1п11пе Сурепатае Тгатгв::АссТ асспгл(Т сопле* Ьед, Т сопвг* епс() ( гетпгп Ассшн<т, тгатгв>::ассша(Ьед, епс)); 15.1.4.

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

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

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

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

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

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