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

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

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

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

Более простой вариант, представленный здесь, был разработан одним из авторов данной книги — Дэвидом Вандевурдом (Ран(д Чапдечоогде). Метод СКТР используется еще с 1991 года Первым этот метод описал Джеймс Коплиен (1ашез Сорйеп) [1О).

С тех пор было опубликовано множество разнообразных применений СУТР. Однако иногда СКТР ошибочно применяют к параметризованному наследованию. Как было показано, СКТР не требует, чтобы наследование было параметризовано, а многие формы параметризованного наследования не согласуются с СКТР. Кроме того, СКТР иногда путают с методом Бартона-Нэкмана (см. раздел 11.7, стр. 201).

Наш пример ОЬз еесСоппсег практически идентичен методу, разработанному Скоттом Мейерсом (Ясон Меуегз) (22). Билл Гиббонс (В!1! О!ЬЪопа) был основным инициатором введения оптимизации пустого базового класса в язык программирования С++, а Натан Майерс (Ыа!Ьап Муегз) предложил шаблон, подобный нашему ВавемезяЬеграгг, для получения максимальной пользы от применения данной оптимизации. В библиотеке Вооз! имеется значительно более сложный шаблон сошргеввес) разг, который решает ряд упомянутых в данной главе проблем и который может использоваться вместо разработанного нами шаблона ВавеыеазЬегРазг. Глава 17 Метапро1 раммы Метапрограммирование — это автоматизированное программирование. Другими словами, в процессе метапрограммирования создается код, который, в свою очередь, генерирует новый код, выполняющий поставленные разработчиком задачи.

Обычно понятие метаироепаимирование подразумевает рефлексивностзс метапрограммный компонент — это часть программы, для которой он генерирует фрагмент прогрйммного кода. Зачем нужно мегапрограммирование? Как и большинство других технологий программирования, оно применяется, чтобы достичь больших функциональных возможностей ценой меньших затрат, измеряемых объемом кода, усилиями на сопровождение и т.п.

Характерной особенностью метапрограммнровання является то, что определенная часть необходимых пользователю вычислений выполняется на этапе трансляции программы. Его применение часто объясняется повышением производительности (вычисление, которое происходит во время трансляции, легче оптимизировать) или упрощением интерфейса (как правило, метапрограмма короче, чем программа, которая генерируется во время ее работы), а зачастую — обеими причинами. Нередко работа метапрограммы основана на использовании классов свойств и типов функций, описанных в главе 15, "Классы свойств и стратегий"„с которой рекомендуется ознакомиться до изучения материала данной главы.

17.1. Первый пример метапрограммы В 1994 году на заседании Комитета по стандартизации языка С++ Эрвин Анрух %гччп Упгай) доложил о том, что шаблоны можно применять для некоторых вычисле"нй во время компиляции, и написал программу, которая находит простые числа. Интересно, что вычисление простых чисел в этой программе выполнялось в процессе компи""ции, а не во время работы программы. Точнее говоря, компилятор выдавал последовательность сообщений об ошибках с простыми числами от двух до некоторого заранее заданного значения. Хотя зту программу нельзя считать переносимой (сообщения об ошибках не станлартнзнрованы), она продемонстрировала, что механизм инстанцироваиня шаблонов можно использовать как примитивный рекурсивный язык, способный выполнять нетривиальные вычисления во время компиляции.

Вычисления такого вида„ко- Глава 17. Метапрограммы 326 торые проводятся с помощью шаблонов, принято называть шаблонным метанрограммпрованием (гешр!аге шегаргоягаппщпя). В качестве введения в метапрограммирование начнем с простого упражнения (упомянутая выше программа Эрвина, вычисляющая простые числа, будет рассмотрена позже). Программа, к изучению которой мы переходим, демонстрирует, как возвести число 3 в заданную степень во время компиляции. // шепа/роьгЗ.Ьрр №№йпйеб РОИЗ НРР №бе№1пе РОИЗ НРР //' Исходный шаблон для возведения числа 3 в п-ю степень Сешр1апе<1пп Н> с1азз РоьгЗ ( рцЫ№с: епитп ( хезц1с = 3 * РоьгЗ<Н-1>:гкезц1с ); ); // Полная специализация для завершения рекурсии сешр1асе<> с1азз РоиЗ<0> ( риЫ 1с: епшп ( кезц1с = 1 ); №епЖЕ //РОХЗ НРР В основе мегапрограммирования лежит рекурсивный механизм инстанцнрования шаблонов .

Чтобы вычислить с помощью приведенной выше программы 3", в ней применяется рекурсивное инстанцирование шаблонов, которое осуществляется по таким правилам: 1) 3" = 343п ', 2) 3 = 1. В первом шаблоне реализовано общее рекурсивное правило. Пешр1апе<1пп Н> с1азз РоиЗ ( райс: епитп ( кези1С = 3 * РомЗ<Н-1>:гюезц1С В процессе инстанцирования для какого-нибудь целочисленного значения Н в шаблоне РоиЗ<> необходимо вычислить значение переменной перечислимого типа кези1С. Это зиа чение в три раза больше значения для того же шаблона, инстанцированного лля числа Н-1 ! Пример рекурсивных шаблонов уже встречался в разделе 12.4, стр.

225. агат пример можно рассматривать как простейший случай метапрограммировапия. 17.2. Значения перечислимого типа и статические константы 327 Второй шаблон — это специализация, завершающая рекурсию. В нем задается значение переменной гевп1Г для РоыЗ<0>. сещр1асе<> с1авв РоыЗ<0> ( рпЫ(с: епцш ( геви1с = 1 ) г )' Рассмотрим более подробно, что происходит в процессе вычисления с помощью этого шаблона числа 3'. Для этого нужно инстанцировать шаблон РоыЗ<7>.

// шепа/роыЗ.срр Фйпс1пс)е <1овггеаш> Фйпс1пс)е "ромЗ.)трр" 1пг ша1п() ( вгй::соипс « "РомЗ<7>::геви1С = " « РомЗ<7>::геви1С « '1п'г Сначала компилятор инстанцирует шаблон РоыЗ < 7 >. В результате получим: 3 * РоэгЗ<б>::геви1Г Теперь нужно инстанцировать тот же шаблон для И = б. Для этого, в свою очередь, понадобится шаблон РоыЗ<5>, РомЗ<4> и тд. Рекурсия завершается инстанцированием шаблона РоыЗ<> для И = О, в результате которого переменной геви1С присваивается значение 1. Приведенная выше программа с шаблоном РоыЗ<> (включая его специализацию для Ы = О) называется игаблонной метанроаэаммой (гешр! аГе шещргояташ). Рассмотренный пример демонстрирует, как произвести вычисление, которое выполняется на этапе трансляции программы во время инстанцирования шаблона.

Этот пример сравнительно простой и на первый взгляд может показаться не очень полезным. Однако в некоторых ситуациях подобные приемы программирования весьма удобны. 17.2. Значения перечислимого типа и статические константы В старых компиляторах С++ значения перечислимого типа были единственной возможностью для программиста получить в свое распоряжение "истинные" константы (так называемые выражения-константы (сопзГапГ-ехргезз!опз)), которые можно применять в объявлении класса. Однако в процессе стандартизации языка С++ появилась концепция внугриклассных статических инициализирующих констант, что существенно изменило ситуацию.

Применение этих констант проиллюстрировано в приведенном ниже примере. 328 Глава 17. Мстапрограммы всгцсс ТгцеОопвгапкз ( епцш ( Т)згее = 3 вгаг№с 1пг сопвг Роцг = 4; )' Здесь Роцг — такая же истинная константа, как и Т)тгее. С учетом сказанного выше рассмотренную в предыдущем разделе метапрограмму РоиЗ можно переписать. // шега/роиЗЬ.)трр №Тйпдей РОНЗ НРР №йей1пе РОХЗ НРР // Исходный шаблон для возведения числа 3 в п-ю степень. сешр1аге<1ПГ Н> с1авв РоиЗ ( рцЫ Тс: всас№с 1пс сопвс гевц1с = 3 * РоиЗ<н-1>::гевц1г; ); // Окончательная специализация, завершающая рекурсию.

гешр1асе<> с1азв РоиЗ<0> ( рцЫТс: всагйс Тпс сопвс гевц1с = 1; №епс)1й //РОУЗ НРР Единственное отличие данной версии программы от предыдущей заключается в том, что в ней вместо значений перечислимого типа используются статические константы- члены. Однако эта версия обладает одним недостатком: дело в том, что статические константы — это 1ча!ае. Предположим, что в программе объявлена функция наподобие чойб йоо(1пг сопвса); и в нее передается результат выполнения метапрограммы боо(РомЗ<7>::гезц1С); В этом случае компилятор должен передать функции адрес переменной-члена РоыЗ<7>::гевц1е следующим образом: инстанцировать определение этой статическои переменной-члена и поместить ее в определенную ячейку памяти.

В результате вычисление больше не ограничивается лишь процессами, происходящими во время компиляции. Переменные перечислимого типа не являются 1та!ле (т.е. они не могут иметь адрес) Таким образом, если они передаются "по ссылке", статическая память не используется Все происходит почти точно так же, как если бы вычисленное значение перелавалась как 17.3. Второй пример: вычисление квадратного корня 329 литеральная константа.

Учитывая изложенное, мы предпочитаем использовать во всех приведенных в этой книге метапрограммах переменные перечислимого типа. 17.3. Второй пример: вычисление квадратного корня Рассмотрим несколько более сложный пример — метапрограмму, вычисляющую квадратный корень заданного числа Б. Приведем код этой метапрограммы и изложим принцип ее работы. // шега/зс)гг1.)зрр №1йпйе№ Я()НТ НРР №с)ей№пе Я()КТ НРР // Первичный шаблон, предназначенный для вычисления вс)гс(Н) ГешР1асе <Тпс и, 1пс ВО=1, 1пс НХ=М> с1авз Яс(гс ( ри)э1хс: // Вычисление округленного среднего значения. епцш ( шЫ = (1 О+Н1+1)/2 )з // Определяем, в какой половине числового отрезка // находится искомое значение.

епшв ( гези1Г = (И<ш№с)*ш16) ? Яс)гс<И,ЬО,ш№с)-1>::гевц1Г Яс)гс«Н,ш16,Н1>::гези1Г ); // Специализация шаблона для случая ЬО = Н1. Гешр1аге <1пс М, 1пг м> с1авв Яс(ге<И,М,М> райс: епша ( гезц1с = М ); №епс)1№ // Я()НТ НРР В первом шаблоне реализовано общее рекурсивное вычисление, которое вызывается с паРаметром шаблона М (квадратный корень которого вычисляется) н двумя другими необязательными параметрами. Этими параметрами задакпся минимальная и максимальная границы числового отрезка, на котором выполняется поиск результата.

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

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

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

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