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

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

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

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

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

Это означает, что необходимо определить несколько членов-синонимов типа Рагашь)т, а также перегрузить оператор вызова функции (орегахог ( ) ) для соответствующего числа параметров. Послелнее выполнить не так сложно, как может показаться. Оператор вызова функции может быть перегруженным, поэтому достаточно задать его определение для каждого возможного количества параметров вплоть до некоторого довольно большого числа (в библиотеке функторов, предназначенной для промышленного применения, это количество может постигать 20), Любая попытка вызвать перегруженный оператор с числом Глава 22. Объекты-функции и обратные вызовы 474 параметров, для которого он не определен, приведет к возникновению ошибки компиля- ции, что вполне нас устраивает.

Возможный код шаблона Соврозег приведем ниже. Еевр1асе <Гурепаве Р01, Гурепаве Р02> с1азз Соврозег : рг1часе ВазеМев<Р01,1>, ргфчасе ВазеМев<Р02,2> рц)э11с: // "Вызов функции" без аргументов: КеццгпТ орегацог() () гесцгп Ваземев<Р02,2>::орегацог() (ВазеМев<Р01, 1>::орегасог()()) // "Вызов функции" с одним аргументом: Кегигпт ор~егагог() (Гурепаве Рогыагс)рагавТ<рагав1Т>::Туре ч1) ( гесигп ВазеМев<Р02,2>".:орегасог() (Ваземев<Р01,1>::орегасог()(у1]); // "Вызов функции" с двумя аргументами: КетпгпТ орегагог() (Гурепаве Рогьгагс)рагавт<Рагав1Т>::Туре у1, сурепаве Рогыагс)РагавТ<Рагав2Т>::Туре у2) ( гесцкп ВазеМев<Р02,2>::орегацог() (Ваземев<Р01,1>::орегасог()(у1, ч2))г Теперь осталось определип члены Рагав1Т, Рагав2Т и т.д.

Задача усложняется тем, что эти типы используются в объявлении различных операторов вызова функции, поэтому они должны быть корректны, даже если сочетаемые функторы не имеют соотвегствуюших параметров . Например, комбинируя два функгора, у каждого из которых по одному парамет- 9 ру, необходимо позаботиться о том, чтобы тип Рагав2Т был корректным параметром типа. Желательно, чтобы этот тип случайно не совпал с другим типом, применяемым в пользовательской программе. К счастью, эта проблема уже решена в шаблоне Рипсгограгапь Итак, шаблон Соврозе может быль осншцен различными членами-синонимами типов.

севр1асе <сурепаве Р01, гурепаве Р02> с1азз Соврозег: рг1чаце Ваземев<Р01,1>, я Заметим, что в данной ситуации лрншлш БНХАЕ (см. раздел 8.3.1, отр. 129) неприменим. поскольку это обычные функции-члены, а не шаблоны функций-членов. Применение принципа ЯЯХАЕ основано на кьшоце параметров шаблонов, который не используется ллл обычных Функций-членов. 475 22.7. Композиции объектов-функций рг1часе Вавемев<Р02,2> ( ри)з11с: // Возвращаемый тип — это просто: сурес)ей сурепаве Р02::ВесигпТ КееигпТг // Определяем Рагав1Т, Рагав2Т и т.д.

// Облегчаем определение с помощью макроса ()с)ей1пе СовровеРагавТ(И) Гурес)ей Гурепагле ~ Рипсгогракав<РО1, М>г:Туре Рагав()()И()(гТ СовровеРагавТ(1); СовроверагавТ(2)г СовроверагавТ(20) ()ипйе1 СовроверагавТ Наконец, нужно определить конструкторы класса Совровег. В них должны сочетаться два функтора, однако составим определение тяк, чтобы можно было составлять различные комбинации из функтороя с модификатором сопи г и без него.

Гевр1асе <Гурепаве Р01, Гурепаве Р02> с1авв Совровег : ргйчасе Вавемел<Р01,1>, ргйчаге ВавеМев<Р02,2> ( риЫйс: // Конструкторы: Совровег(Р01 сопвсй б1, Р02 сопвсй Х2) Вавемев<Р01,1>(й1), ВавеМев<Р02,2>(й2) ( ) Совровег(Р01 сопвгй К1, Р02й б2) ВавеМев<Р01,1>(Х1), Вавемев<Р02,2>(й2) ( Совровег(Р01й й1, Р02 сопвсй б2) ВавеМев<Р01,1>(й1), Вавемев<Р02,2>(й2) ( ) Совровег(Р01й Е1, Р02й б2] ВавеМегл<Р01, 1>(й1), ВавеМев<Р02,2>(й2) ( ) Располагая библиотекой, в которой содержится такой код, программист может пользояаться простыми конструкциями, проиллюстрировянными в приведенном ниже примере.

йипссогв/совровеб.срр яйпс1иг(е <1овсгеав> ()Тпс1иде типсрсг.)трр" Глава 22. Объекты-функции и обратные вызовы 476 ()1пс1ийе "соврозеб.Ьрр" ()1пс1иг)е "соврозесопч.Ьрр" доиЬ1е асЫ(г)оиЬ1е а, с)оиЬ1е Ь) ( гегигп а+Ь| ) с)оиЬ1е сю1се(с)оиЬ1е а) гегигп 2*а; ) 1пг ва1п() ( згг)::соиг <~ "совриге (20+7)*2: « соврозе(Еипс рсг(асЫ),йипс ргг(гьг1се)](20,7) « '~п'; ) Описанные программные инструменты могут быть улучшены. Например, полезно было бы дополнить шаблон соврозе таким образом, чтобы он мог непосредственно обрабатывать указатели на функции (при этом отпадет необходимость использования бипс рсг).

Однако для краткости предлагаем заинтересованным читателям рассмотреть этот вопрос самостоятельно. 22.8. Связывание значений Часто бывает так, что функтор с несколькими параметрами остается полезным и после того, как один из его параметров будет связан (Ьоиш)) с определенным значением. Например, рассмотрим простой шаблон функтора М1п.

у/ йипссогз/в1п.Ьрр еевр1асе <Гурепаве Т> с1азз М1п ( риЬ11с: гурес)ей Т ПегигпТ; сурес)ей т Рагав1т; Гурес)ей Т Рагав2Т; епша ( Миврагавз = 2 ПесигпТ орегагог() (Рагав1Т а, Рагав2Т Ь) ( гегигп а<Ь ? Ь : а; ) 22.8. Связывание значений 477 На основе этого шаблона можно создать новый функтор С1ашр, в котором один из параметров связан с определенной константой. Эту константу можно задать в виде аргумента шаблона или в виде аргумента времени выполнения.

Ниже приведен один из возможных вариантов определения нового функтора. // йипсгогв/с1егар.)зрр сешр1асе <сурепалзе т, т шах геви1с> с1авв С1апр : рг1чаее Мсп<Т> ( риЬ11с: Еурег)ей Т ВегигпТ/ сурег)ей Т Рагааз1Т; епига ( ИимРагатв = 1 ВегигпТ орегаеог[) [Рагам1Т а) ( гесигп мйп<т>::орегасог() (а, шах геви1г] ) ); Хотя для связывания параметра "вручную" часто достаточно написать небольшой объем кода, удобно разработать шаблон, автоматизирующий эту задачу. 22.8.1. Выбор параметров связывания Связывающий шаблон (Ыпдег) связывает определенный параметр указанного функтора с заданным значением. Каждый из них можно выбирать во время работы (с помощью аргументов функции) нлн во время компиляции программы (с помощью аргументов шаблона).

Например, в приведенном ниже шаблоне все параметры выбираются статически (во время компиляции). Гелзр1аге<гурепазае Р, Тпк Р, Тпс Ч> с1авв Вйпс(1псЯсаейса11у; // Р— тип функтора; // Р— связываемый параметр; // Ч вЂ” связываемая величина Каждый параметр связывания (вид функгора, связываемый параметр и связываемая величина) можно также с различной степенью удобства выбирать динамически.

Труднее всего выбирать параметр, который будет связан динамически. По-видимому, для этого понадобится большое количеспю инструкций вийссЬ, с помощью которых вызов функтора будет преобразован в вылов одного нз возможных вспомогательных функторов, При этом выбор конкретного вспомогательного функгора осуществляется в зависимости от того, какое значение имеет определенная величина во время работы программы. высгсЬ (Г)зсв->Рагащ пигл) ( саве 1: гееигп Р::орегасог!)(ч, р1, р2)' саве 2-' Глава 22. Объекты-функции и обратные вызовы 478 гесигп Р::орегасог()(р1, ч, р2); саве 3: гесигп р::орегасог()(р1, р2, ч]; с)ейаи1с: гесигп Р::орегасог()(р1, р2); // Или это ошибка? ) Пожалуй, из всех трех вариантов связывания данный в наименьшей степени нуждается в динамическом осуществлении.

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

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

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

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

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