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

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

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

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

На наш собственный класс, производный от класса ю1 ддес, такие ограничения не накладываются. Каким образом можно специализировать функцию Сгеате так, чтобы она обрабатывала объект класса ы1ддес иначе, чем все другие классы? Очевидное решение таково: нужно создать отдельную функцию сгеасеызддес. К сожалению, в данный момент не существует универсального интерфейса для создания объектов класса ы)ддег и объектов, производных от этого класса. Это делает функцию сгеасе непригодной лля использования в обобщенном коде (депепс себе). Функцию невозможно специализировать отдельно, т.е. нельзя написать что-то вроде следующего кода. О неправильный код — не пытайтесь его применять! гевр1ате <с1азз ц> ы1ддет* сгеахе<Мддес, ц>(сопке цб агд) ( гесцгп пеп ы1бдес(агд, -1); В отсутствие частичной специализации функций существует только одно средство — перегрузка.

Следовательно, для решения поставленной задачи можно передать функции сгеате фиктивный объект (дцщгпу оь)есг) типа т и применить перегрузку. 53 Глава 2. Приемы программирования севр1асе <с1аьз т, с1азз ц> т' сгеахе(сопзс цв агд, т /* фиктивный объект */) ( гесцгп пев т(агд); ) севр1асе <с1аьа ц> и1бдес* сгеасе(сопят цв агд, и(гадес /* фиктивный объект */) ( гесцгп пев и1ддес(агд, -1); ) Такое решение может повлечь за собой перегрузку конструктора сколь угодно сложного объекта, что также практически бесполезно. Нам необходимо эффективное средство для передачи информации о типе т в функцию Сгеасе.

Для этого и нужен класс туре2туре. Объект этого класса представляет собой идентификатор, нссуший информацию о типе. Его можно передавать псрсгружасмым функциям. Рассмотрим определение класса туре2туре. севр1асе <сурепаве т> зсгцсс туре2туре ( суредеГ т огзд(па1туре ); Класс туре2туре предназначен для передачи любого значения, причем каждому отдельному типу соответствует своя конкретизация, что и требовалось доказать. Теперь мы можем написать слсдуюший код. // Реализация функции Сгеасе на основе перегрузки // и класса туре2туре сеюр1асе <с1азз т, с1аза ц> т* сгеасе(сопзс цв агд, туре2туре<т>) ( гесигп пев т(агд); ) сеюр1асе <с1аьа ц> и1ддес* сгеасе(сопзс цю агд, туре2туре<и)гадес>) ( гесцгп пев и(гадес(агд, -1); // используем функцию Сгеасе зсг(пд* рзсг - сгеасе("не11о", туре2туре<зсгзпд>о); подет* ри = Сгеасе(100, туре2туре<и(гадес>0); Второй параметр функции сгеасе предназначен только для выбора подходяшсй перегрузки.

Теперь эту функцию можно специализировать различными конкретизациями класса туре2туре, которые преобразовываются в разные типы, используемые в нашем приложении, 2.6. Выбор типа Иногда в обобшснном коде возникает необходимость выбрать тип в зависимости от булсвской константы, Допустим, что в примере, связанном с классом н(ЕсуСопса( пег, который обсуждался в разделе 2.4, в качестве средства лля внешнего хранения мы хотим использовать объекты класса зсб:: уессог. Очевидно, полиморфныс типы можно хранить только в виде указателей, а не значений.

С другой стороны, мы можем потребовать, чтобы непгьчиморфные типы сохранялись в виде значений, поскольку это более эффективно. Часть!. Методы Рассмотрим шаблонный класс. севр1асе <сурепаие т, Ьоо1 ззяо1уаогрМ с> с1авв н1Нусопсазпег ( Потребуем, чтобы в нем хранились объекты класса цессог<т'> (если значение переменной 1зро1уиогрИс равно сгие) либо объекты класса цессог<т> (если значение переменной )зро1уиогрИс равно Га1зе). По сушеству, нам нужен оператор суредеГ ца1иетуре, значением которого в зависимости от значения булевской переменной (зяо1уиогрЬ1с являются типы т* или т, Для этого можно применить шаблонные классы характеристик (зтайз) (А1ехапбгсзсц, 2000а). сеир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зе, т, и> ( суреде1 ц яезц1с; )) Если значение переменной Г1ай равно сгце, компилятор использует первое (обобшенное) определение, и, следовательно, тип яевц1с становится равным т.

Если значение переменной Е1ай равно Га1зе, вступает в действие специализация, и тип кевц1с становится равным ц. Теперь намного легче определить переменную н(Гсусопса(пег::ца1цетуре. сеир1асе <сурепаие т, Ьоо1 звяо1уиогрИ с> с1азз н(Гсусопсазпег 55 Глава 2. Приемы программирования гуребеУ турепаве ве1есг<1аро1увогрп(с, т=, т>::яеэц1т уа1цетуре; 2.7. Распознавание конвертируемости и наследования на этапе компиляции При реализации шаблонных функций и классов часто возникает следующий вопрос. Даны два произвольных типа т и ц, о которых ничего не известно. Как определить, наследует ли класс 0 свойства класса т? Распознавание таких отношений является ючючевой проблемой при оптимизации обобщенных библиотек.

Если класс реализует определенный интерфейс, при работе с обобщенной функцией можно положиться на оптимизированный алгоритм. Такое распознавание на этапе компиляции позволяет избежать динамического приведения типов с помощью оператора булав)с сазе, на что обычно уходит много машинного времени. Распознавание наследования — более общий процесс, чем распознавание конвертируемости. Общая проблема формулируется следующим образом. Как узнать, возможно ли автоматическое преобразование произвольного типа т в произвольный тип ц? Можно.

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

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

Итак, сначала создадим два типа с разными размерами. (Очевидно. что типы спаг и 1опо доцЫе имеют разные размеры, однако это не гарантируется стандартом.) Безопасная схема выглядит следующим образом. з Есть прелложеиис включить а язык С++ оператор сурепка, т.е. оператор, аозвращающии тип выражения. С его помощью намного проще писать и понимать шаблонные коды. Язык Спа С++ уже реализовал оператор туреог в качестве своего расширения. Очевидно, что оператор гуреоЕ и функция э1хеоГ используют один и тот же код, поскольку а любом случае функция з(хеоЕ должна распознавать тип.

Часть!. Методы туредеК сйаг 5аа11; с1азз в19 ( сйаг осаму(23; По определению значение 51геоу(5аа11) равно 1. Размер типа в)д неизвестен, но он определенно больше, чем ! (гарантировать можно только это). Затем нам понадобятся две перегрузки. Олна из них должна получать параметр типа ц, а возврашать —. значение типа 5аа11, например: 5аа11 тезт(0); Как написать функцию, получаюшую "что-нибудь другое"? Шаблон не полходит, поскольку он всегда квалифицируется как наилучшее соответствие, а значит, скрывает преобразование типов. В ланном случае нам нужно "плохое" соответствие, т.е.

преобразование, которое происходит, только если автоматическое преобразование невозможно. Бегло просмотрев правила преобразования, применяемые к функции, легко убелиться, что наихудшим является соответствие, порождаемое эллипсисом (е)йрз(з тагсЬ), которое находится в самом конце списка. в19 тезт(...); (Передача объекта в функцию, описание которой содержит эллипсис,может привести к непредсказуемым результатам, но это не имеет значения. На самом деле функция не вызывается. Она даже не реализуется. Напомним, что функция з(геоГ не вычисляет свой аргумент.) Теперь нам необходимо применить функцию ззгеоГ к вызову функции тезт, передав ей объект типа т. сопзт Ьоо1 сопчвх)зтз = 51геот(теэт(т())) == 51хеоб(5аа11); Вот и все! При вызове функция тезт получает объект, созданный по умолчанию,— то, а затем функция 51геот вычисляет размер результата этого выражения.

Это может быть либо число 51хеот(в1д), либо число 51геот(5аа11), в зависимости от того, нашел компилятор преобразование или нет. Осталась нерешенной олна небольшая проблема. Если объект класса т создается закрьпым конструктором, прелусмотренным по умолчанию, то выражение тО порождает ошибку во время компиляции, что разрушает всю нашу стройную конструкцию. К счастью, эта проблема имеет простое решение.

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

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

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