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

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

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

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

В результате можно написать код, например, следующего вида: 1й (ТуреТ<Т>:: ХврекТ) ( е1ве Хк (ТуреТ<Т>::Хес1аваТ) ( Более того, выражения наподобие ТуреТ<Т>:: 1вРскТ будут представлять собой логические константы — корректные, не являющиеся типами аргументы шаблонов. В свою очередь, зто обеспечит построение более сложных и мощных шаблонов, поведение которых зависит от свойств их аргументов типов. 19.1. Определение фундаментальных типов Прежде всего разработаем шаблон для определения того, является ли передаваемый тип фуицаментальным типом языка программирования. Считая, что по умолчанию тнп не является фундаментальным, специализируем шаблон для фундаментальных типов.

// сурев/Суре1.)зрр // Основной шаблон: Т не является фундаментальным типом Сешр1аее<еурепаше Т> с1авв Хврипс)аТ риЬ11с: еппш ( уев = О, Ыо = 1 )' Глава 19. Классификация типов 372 // Макрос для специализации для базового типа №йеУХпе МК Р(]ИОА. ТУРЕ(Т) Сещр1аге<> с1авв ХврцпйаТ<Т> ( риЫ Хс: епша ( Уев = 1, Ио = О ); МК РОИХ]А ТУРЕ(чоай) МК Р(ВП] ТУРЕ(Ьоо1) МК РОИОА ТУРЕ(сЬаг] МК Р()ИОА ТУРЕ(вйдпей сЬаг) МК Р(ВП]А ТУРЕ(ипвйдпей сЬаг) МК РОИЭА ТУРЕ(исЬаг С) МК Р\ВП]Л ТУРЕ(вйдпей вЬога) МК РОМБА ТУРЕ(ипв1дпей вЬогг) МК Р(ВП]А ТУРЕ(вйдпей Хпа) МК РОИХ]А ТУРЕ(ипв№дпей Хпа) МК Р(ВП]А ТУРЕ(в1дпей 1оцд) МК РОИЩА ТХРЕ(ипвйдпей 1опд) №ХУ 1 ОИОХОИС ЕКХЯТЯ МК Р(ВП]А ТУРЕ(вйдпей 1опд 1опд) МК РОИОЛ ТХРЕ(ипв1дпей 1опд 1опд) №епйХЕ // ЬОИСХОИО ЕХХЯТЯ МК Р~ЛЯХ]А ТУРЕ(Й1оае) МК РОИЭЛ ТУРЕ(йоиЫе] МК Р(ВП) ТХРЕ(1опд йоцЫе) №ипйеУ МК Р(РП]А. ТХРЕ Первый шаблон определяет общий случай, т е.

а общем случае ХвРипйаТ<Т>:: Уев равно О (или Уа1ве). севр1аее<еурепаще Т> с1авв ХврцпйаТ ( риЫ1с г елшп ( Уев = О, Ио = 1 ): ): Для каждого базового типа определена специализация таким образом, что хвРипйат<т>:: уев равно 1 (или сне). это реализуется с помощью макроса, разворачивающегося а необходимый код. Например, МК РОЪП)А ТУРЕ(Ьоо1) разворачивается а 19.2.

Определение составных типов 373 Сешр1аке<> с1авв 1вРппс\аТ<Ьоо1> ( риЬ11с ." епша ( Уев = 1, Мо = О ); ); Далее приведена демонстрационная программа, использующая этот шаблон. // сурев/суре1севс. срр ййпс1ис)е <1овсгеаш> ()Фпс1ис)е "суре1.Ьрр" Сепр1аае <Сурепагае Т> уойс) Сева(Т сопиев с) ( Н (1вРппдаТ<Т>::уев) ( вас)::собак « "Т вЂ” фундаментальный тип" « вес)::епс)1; е1ве вай::соне « "Т вЂ” не фундаментальный тип" « всс)::епд1; с1авв МуТуре ( ): Фпс тайп() ( сенс(7)х Сева(Мутуре()); При запуске этой программы будет получен следующий вывод: Т вЂ” фундаментальный тип Т вЂ” не фундаментальный тип Точно так же можно определить функции 1в1пседга1т и 1вР1оас1пдт для выяснения того, является ли некоторый тип интегральным скалярным типом или скалярным типом с плавающей точкой.

19.2. Определение составных типов Т ы. онструнрованные из других типов, называются составными. Простейшие составные типы включают, например, простые типы, указатели, ссылки и массивы. Все они построены на основе одного базового типа. Классы и функции также являются состав- 374 Глава 19. Классификациятипов ными типами, но они могут включать несколько фундаментальных типов (в качестве параметров или членов).

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

ВоссошТ вЂ” окончательный тип, не являющийся ссылкой, указателем или массивом, на основании которого построен тип Т. Так, если Т представляет собой Хпг**, то ВавеТ является синонимом Хпс*, а Вогсошт — синонимом Хпг. Для случая указателя на член ВаяеТ представляет собой тип члена, а С1авзТ вЂ” класс, которому этот член принадлежит. Например, если Т— указатель на функцию-член типа Хпс (Х::*) (), то ВазеТ является типом функции Хпк ( ), а С1аввТ соответствует Х. Если Т не является указателем на член, то С1аввТ представляет собой Сошроипй<чойй> (этот выбор произволен: вы можете предпочесть использовать не класс). Частичная специализация для указателей и ссылок достаточно проста. // курев/суреЗ.Ьрр Гетр1асе<сурепаше Т> с1азз Сошроцпйт<та> ( // частичная специализация для ссылок рцЬ11с: епша ( ХзРГг = О, 1зиебТ = 1, ХздггауТ = О, ХврцпсТ = О, ХвРГгМешТ Ь О )р Гурейеб Т ВавеТ; Гурейей сурепаше СошроцпйТ<Т>::ВоссошТ ВоссошТ; гурейеЕ СошроопйТ<чойй> С1аввТ; Гешр1асе<сурепаше Т> с1авв СошроцпйТ<Т*> ( // Частичная специализация // лля указателей рцЬХХс: епцш ( ХвРСг = 1, ХвпеХТ = О, ХвдггаУТ = О, 19.2.

Определение составных типов 575 ХвРцпсТ = О, ХвРсгМежТ = О ); Гурейеб Т ВавеТ; сурейе~ Сурепаже Совроцпйт<Т>::ВоссошТ ВоссошТ; гурейеб Сотроцпйт<чойй> С1аввТу // сурен/суре4.Ьрр ()Хпс1цйе <веййей.Ь> Сетр1асе<сурепазае Т, взхе С М> с1авв СотроцпйТ<Т[М)> ( // Частичная специализация // лля массивов рцЬ11с: епшв ( ХвРГг = О, ХврцпсТ = О, Еурейей Т ВавеТ; Еурейей Гурепатпе СотроцпйТ<Т>::Воссожт Воском; сурейей Соироцпйт<чойй> С1аввТ; Хвпейт = О, ХваггауТ = 1 ХвРСгМевТ = О Севр1асе<гурепате Т> с1авв СоироцпйТ<Т[]> ( // Частичная специализация // лля пустых массивов рцЬ11с: епшв ( Хвргг = О, ХвРцпсТ = О, Гурейеб Т ВавеТ; сурейей сурепке СопроцпйТ<Т>::ВокговТ ВоггогаТ; сурейей СотроипйТ<чоуй> С1аввт; 1вдебТ = О, ХвдггауТ = 1 ХврсгмежТ = О Гепр1аге<сурепазае Т, курева/ае С> с1авв СомроцпйТ<Т С:г*> ( // Частичная специализация // для указателей на член рцЬ11с: епша ( ХвРГг = О, 1вРцпсТ = О, Сурейей Т ВавеТ; Сурейей сурЕПатаЕ Сомроцпйт<Т>::Воспоют ВоепотТ; Сурейей С С1аввт; 1вКебТ = О, ХвдггауТ = О ХврегмевТ = 1 ); Массивы и указатели на члены могут рассматриваться с использованием той же методики, но для вас может оказаться неожиданностью то, что частичная специализация включает большее количество параметров, чем исходный шаблон.

Глава 19. Классификациятипоа 376 Внимательный читатель должен был заметить, что определение члена ВогговТ требует рекурсивного инстанцирования шаблона Совроипс)Т для различных типов Т. Рекурсия завершается, когда Т больше не является составным типом и используется определение обобщенного шаблона (либо когда Т представляет собой тип функции, как вы увидите позже). Распознать функции гораздо сложнее. В следующем разделе для этого используются более "продвинутые" методы. 19.3. Определение типов функций Связанная с определением типов функций проблема состоит в том, что в силу произвольного количества параметров не существует конечной синтаксической конструкции, описывающей их все.

Один из подходов к решению этой задачи — частичные специализации для функций со списком аргументов, который короче заданного ограничения. Приведем несколько первых таких специализаций. // курев/суре5.)трр севр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): 377 19.3.

Определение типов функций Сурес)ей Согароипс)Т<чойс)> С1аввТ; Преимущество такого подхода в явном' создании членов сурес)ей для каждого типа параметра. Более обобщенный метод использует принцип ЗРПЧАЕ (зп(вйЖоп-(айнге-)а-по(-апепог — неверная подстановка не является ошибкой; см. раздел 8.3.1, стр. 129). Ключевым в использовании принципа ЯНХАЕ в данном случае является поиск конструкции, которая некорректна для функций, но корректна для всех иных типов (или наоборот). Поскольку вы уже можете распознавать ряд категорий типов, их можно исключить из рассмотрения. Таким образом, можно воспользоваться массивами, элементы которых не могут иметь тип чойс), быль ссылками или функциями.

В результате появляется приведенный ниже код. Сегар1асе<сурепаюе Т> с1авв 1врипсе1опТ ( рг1чаее: суредеб с)так Опе; курейшей записе ( сйах а(2); ) Тмо! сешр1асе<сурепзлге (г> всас1с Опе сенс[...)г сеа!р1аее<сурепагае О> всасйс тмо севе(У(*)(11); риЫТс: епша ( уев = вуяеой(1зрипсейопТ<Т>::Сезк<Т>(0)) == 1 епша ( Мо = !Хев ); ); При использовании этого определения шаблона значение 1вРипссйопТ<Т>:: Хев будет ненулевым только для типов, которые не могут быть элементами массива. Единственный недостаток этого метода состоит в том, что это справедливо не только для функций, но и для ссылочных типов и типа чо1с).

К счастью, этот недостаток легко устраняется частичными специализациями для ссылочных типов и типа чо16. сел!р1аее<еурепагае Т> с1авв 1врипскзопТ<Ть> ( риЫТс: епша ( Хев = 0 )г епша ( Ыо = !Хев сеюр1асе<> с1авв 1зрипссйопТ<чойс)> ( риЫ1с: епига ( Хев = 0 )! епша ( Ио = !Хез )! 378 Глава 19.

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

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

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

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