Главная » Просмотр файлов » А. Александреску - Современное проектирование на C++

А. Александреску - Современное проектирование на C++ (1119444), страница 21

Файл №1119444 А. Александреску - Современное проектирование на C++ (А. Александреску - Современное проектирование на C++) 21 страницаА. Александреску - Современное проектирование на C++ (1119444) страница 212019-05-09СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Поскольку в языке С++ нет статических итераций или рекурсивных макросов, задача добавления кола для каждого типа, содержащегося в списке, довольно сложна. Можно применить частичную шаблонную специализацию в сочетании с описанными выше алгоритмами, но реализация этого решения будет слишком запутанной и сложной. Решить эту задачу нам поможет библиотека Еок!. 3.

13. 1. Генерация распределенных иерархий Мощные шаблоны библиотеки Ео)ц облегчают залачу построения классов путем применения каждого типа, содержащегося в списке типов, к основному шаблону, предоставленному пользователем. Таким образом, запутанный процесс распределения типов, указанных в списке, по программе пользователя инкапсулирован в библиотеке. Пользователь должен лишь определить простой шаблон с одним параметром. Этот шаблонный библиотечный класс называется бетбсагтегнт'егагс)ту.

Несмотря на то что его определение достаточно просто, этот класс невероятно эффективен. Вот его определение.' Это одна из ситуаций, когда предпочтитсльнсс сначала описать идею и лишь затем — се потенциальные приложения (в отличие от обычного порядка решения задач). 86 Часть !. Методы севр1асе <с1азз ть)зс, севр1асе <с1аза> с1аза ип(с> с1азз пепзсассегнзегагс)<у; // специализация класса пеп5сассегн1егагсйу: // преобразование класа туре11зс в класс ипз'с севр1асе <с1азз т1, с1азз т2, севр1асе <с1азз> с1азз иптс> с1азз пеп5сассегнтегагс)<у<туресззс<т1, т2>, ип)с> ри(<1(с беп5саССегизегагс)<у<т1, ип(С>, риЫ )с пеп5сассегн1егагсЬу<т1, ип(с> с риЫ)с: суреде1 туре11зс<т1, т2> ть1зс; суреде1 аепвсаССегизегагс)<у<т1, ип)с> ье1свазе; суреде1 йеп5саССеги1егагс)<у<т2, ип(с> а(оМвазе; ); (не списка типов) классу ип(с севр1асе <с1азз> с1аза ипзс> риЫ )с ип(с<дсорв)стуре> // передача атомарного типа севр1асе <с1азз дсов1стуре, с1азз пеп5сассегн(егагсйу : суредеб ил(с<ясов)стуре> СЕФсвазе; // с классом ни11туре не делаем ничего севр1асе <севр1асе <с1аза> с1азз ип(с> с1азз аепзсаССеги1егагс(<у<ии11туре, ип1С> с суредеб аес5саттегн)егагс)<у< ттявь15т 3((пс, зсг)пд, и(днес), но1дег> из дое стоило; Глава 3.

Списки типов Шаблонный шаблонный параметр работает так, как и ожилалось (глава 1). Шаблонный класс ип)с передается классу Пеп5саССегН)егагсйу в качестве второго аргумента. Класс оепзсассегн)егагс)<у использует свой шаблонный шаблонный параметр ип)с как обычный шаблонный класс с одним шаблонным параметром. Новые возможности появляются благодаря тому, что пользователь класса бепвсаССегН1егагс)<у может перелавать ему свой собственный шаблон.

Что делает класс пепзсаССегН1егагс)<ут Если его первый аргумент является атомарным типом (в противоположность списку типов), класс пеп5саССегН)егагсЬу передает его классу ипз'с и наследует свойства результируюшего класса ип1с<т>. Если первый аргумент является списком типов тьтзс, класс пепзсаССегН)егагсйу сводится (геси<зез) к классам пеп5сассегн1егагс)<у<ть1зс::неад, ип(с> и пеп5сассегнзегагс)<у<тс(зс«та(1, иптс> и наследует их свойства.

Класс оепзсассегн)егагсйу<ни11туре, ип(с> является пустым. В итоге процесс конкретизации класса Пеп5саССегН)егагсйу завершается наследованием класса ип(с, конкретизированного каждым галлом из списка о<илов. В качестве примера рассмотрим следуюший кол. севр1асе <с1азз т> зсгисс но1дег ( т «а1ие ; Рис. 3.2.

Структура наглсдоаинин класса И 1йясасУо Исрархия наследования, порожденная классом н1ддеттп~о, показана на рис. 3.2. Мы булем называть такие иерархии классовраснрсдслснными (зсапсгсд), поскольку типы в списке типов распрелелены по разным корневым классам. В этом закчючастся сушность класса беп5саттегн1егагспу --. он генерирует иерархию классов для пользователя, многократно конкретизируя шаблонный класс, прслоставлснный ему в качество модели. Затем он собирает все сгснсрированныс классы в олин, в данном случае — класс Ы ддеттп~о. В результате наследования классы но1дег<1пт>, но1оег<этг1пд>, но1дег<нзддет> и нздцеттпФо имеют одну псрсмснную-член аа1ие суре для каждого типа, указанного в списка типов, На рис. 3.3 показана бинарная схема объекта класса нтддестп7о.

Предполагается, что такие пустые классы, как бепвсаттегнзегагспу«но!1туре, но1оег>, игнориру|отся и нс занимают места в составном объекте. 88 Часть й Методы Объекты класса изддетхпФо позволяют делать интересные веши. Например, можно обратиться к объекту класса ахгз пд, хранящемуся в объекте класса мзддехпТо, написав следуюший код.

мзддетхпФо оЬ); ахгзпд пате = (зтатзс сазт<но1дег<зтгзпд>6>(оЬ))).ча1це ; Яанов приведение типов позволяет избежать неоднозначности имени ча1це . В противном случае компилятор не сможет определить, на какой член ча1це вы ссылаетесь. Вддепа1о Рис. 3.3, Схема рисяредскяая иамяти для огеекта клисса Ихсфес!а/о Это приведение типов выглядит ужасно, позтому мы попытаемся облегчить работу с классом пепвсаттегнзегагсйу, снаблив его несколькими удобными функциями доступа. Например, было бы прекрасно иметь доступ к члену класса по его типу. Это довольно просто. // класс гзе1дтгазта описан в файле нзегагсйуцепегатогз.Ь тетр1ате <с1азз т, с1азз н> турепапе ггзчате::гзе1дтга1тз<н>::яеЬзпд<т>::яезц)тй где1д(нб оЬ)) ( гетцгп оЬ); Работа функции гзе1д основана на неявном преобразовании производного типа в базовый.

При вызове г1е1д<мхддет>(оЬ)) (где оЬ) должен иметь тип Ыддетхп5о) компилятор распознает, что но1дег<Мддет> — зто базовый класс по отцов~опию к классу кд ддетхпФо, и просто вернет ссылку на эту часть составного объекта. Почему функция г1е1д является частью пространства имен, а не функцией- членом? Потому что такой высокий уровень обобщенного программирования вынуждает очень осторожно обрашаться с именами.

Представьте, наприлсер, что в классе цпзт определен символ с именем гзе1д. Если бы в классе цепвсаттегнзегагсцу была Функция-член гзе1д, она бы была замаскирована функцией гзе1д, являюшейся членом класса цпзх. Это вызвало бы массу недоразумений. У Функции гзе1д есть один недостаток: ее нельзя применять, если в списке типов есть дубликаты, Рассмотрим немного измененное определение класса м1 ддеххпФо, туредеб пепвсаттегнзегагсйу< тчгвьхвт е(зпт, зпх, ахгзпд, изддет), ча1це> изддетхпУо; Теперь в классе мзддетхп1о есть лва члена ча1це, имеюших тип зпт.

Если вызвать функцию гзе1д«1пт> из объекта класса нзддетхпУо, компилятор пожалуется на неоднозначность. Устранить зту неоднозначность нелегко, поскольку класс нзддетХпТо дважлы наслелует свойства класса но1дег<хпт>, причем разными пугями, как показано на рис. 3.4. 89 Глава 3. Списки типов Утлс. 3.4. Класс ИтдхеИнув наследует свойства класса НаЫег<и~> дважды Нам необходимо средство, позволяющее выбирать поля в конкретизации класса бепдсаттеги)егагсПу на основе позиционного индекса (рой1юпа! 1поех).

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

Кроме того, как показано ниже, лля передачи полученного результата используется класс туре2туре. сетр1ате <с1азз н, турепате я> зп1зпе вй гзе1дне1рег(нй оЬ), туре2туре<я>, тпт2туре<0>) ( турепате н: г ье1твазей ацЬоЬ) = оЬ); гетогп зцЬоЬ); тетр1асе <с1азз н, сурепате я, 1пс з> зп1зпе яй я)е1дне1рег(нй оЬ), туре2туре<я> ст, тпт2туре<з>) ( Сурепате Н::Язйнтвазей зиЬоЬ) = оЬ); гетцгп гзе1дне1рег(ьцЬоЬ), тт, тпт2туре<з -1>()); О класс гзе1дтгазтз описан в файле нзегагсйубепегатогэ.Ь тетр1ате <зпс з, с1азз н> тафр1ата гттуаса::гта16ттатта<Н>:;дс<З>::яаац1тй г1е1д(нй оЬ) ) 90 Часть Ь Методы ( суредег сурепаве Рг(часе::где1дтгадсз<н>::дс<1>::яеви1с яези1с; гесигп г(е1дне1рег(оЬ), туре2туре<кезо1с>о, Хпс2туре<1>О); Остается понять, как написана такая реализация, но, к счастью, это лостаточно легко объяснить. Всю работу выполняют две перегруженные функции где1дне1рег.

Первая из них получает параметр, имеющий тип спс2туре<0>, а вторая — - параметр Хсп2туре любое целое число>. Следовательно, первая перегруженная функция возвращает значение, соответствующее классу цп1с<Т1>8ь а вторая — тип, имеющий указанный индекс в списке типов. Для того чтобы определить, какой тип следует вернуть, функция где1д использует вспомогательный шаблонный класс г1е1дтга1св. Функция г1е1д возвращает этот тип функции г(е1дне1рег через класс туре2Туре. Вторая перегруженная функция где1дне1рег рекурсивно вызывает саму себя, передавая правого предка класса аеп5сассегн)егагсну и тип тпс2туре<1пдех-)>, поскольку поле Х в списке типов является полем !Ч вЂ” 1 в хвосте этого списка, если Х не равно нулю.

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

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

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

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