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

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

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

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

Кроме того, такое решение„вероятно, прояснило бы вопрос о том, когда допустимы конструкции .гевр1асе, ->гевр1аге и:: гевр1аге (см. раздел 9.3.3, стр. 156). Игнорирование "паразитных" применений ключевых слов сурепаве и севр1аге— зто, с точки зрения разработчика компилятора, относительно простая задача.

Интересно, что есть также ситуации, в которых по существующим правилам применять зти юночевые слова необходимо, хотя реализация языка могла бы обойтись без них. Например, компилятор мог бы понять, что в предыдущем шаблоне функции с1еах () имя Аггау<Т>:: Е1евепГТ не может быть ничем иным, кроме имени типа (в зюм месте не допускаются никакие выражения), и поэтому в данной ситуации использование ключевого слова сурепаве могло бы быть необязательным. Поэтому Комитет по стандартизации языка С++ рассматривает также вопрос о внесении в стандарт изменений, способных сократить число ситуаций, в которых необходимо применение ключевых слов сурепаве и севр1аге. 13З.

Аргументы шаблонов функций по умолчанию Когда в язык С++ были впервые включены шаблоны, явное задание аргументов шаблонов функций отсутствовало. Аргументы шаблонов функций всегда должны были логически выводиться из выражения вызова. Поэтому казалось, что нет никаких причин вволить используемые по умолчанию аргументы шаблонов функций, так как они все равно перекрывались бы логически выводимыми значениями. Однако впоследствии стало возможно явно задавать те аргументы шаблонов функций, которые не могли быть выведены логическим путем. Следовательно, было бы вполне естественно задавать используемые по умолчанию значения для таких аргументов шаблонов, не выводимых логически. Рассмотрим приведенный ниже пример.

севр1аге <сурепаве т1, сурепаве т2 = 1пс> Т2 сорпа(Т1 сопегй х) ~ с1аве Му1пе ( 234 Глава 13. Направления дальнейшего развития той еевс(сопсайпег сопвсй с) ( 1пс 1 = сопле (с) ! му1пг = соипг<му1пс>(с)( авзегс(Му1пе == 1)ю ) В данном примере ограничение заключается в том, что если какой-нибудь параметр шаблона имеет используемое по умолчанию значение аргумента, то все параметры, следующие за ним, также должны иметь используемые по умолчанию аргументы шаблона. Такое ограничение необходимо для шаблонов классов; в противном случае было бы невозможно задавать в общем виде последующие аргументы.

Это иллюстрируется следующим ошибочным кодом: Сещр1асе <Гурепаще Т1 = йпе, Еурепаще Т2> с1авв ваг); Вас)<йпе>* Ь; // Данное Тпс замещает Т1 или Т27 Однако в шаблонах функций завершающие аргументы могут быть выведены логическим путем. Следовательно, нет никаких технических трудностей в том, чтобы переписать данный пример. ешар1аее <гурепаще т1 = Тпс, еурепаще т2> Т1 соиле(Т2 сопзсй х); чойй севе(Сопса1пет сопвсй с) ( 1пс 1 = сопле(с) ( Му1пс = соппс<Му1пс> (с) ~ аввегс(Му1пс == 1); ) Во время написания настоящей книги Комитет по стандартизации языка С++ рассматривал вопрос о расширении шаблонов функции в данном направлении. Задним числом программисты также отметили случаи, когда явное задание аргументов шаблонов не используется.

сешр1аее <Сурепаще Т = боиЬ1е> чойс) б(Т сопвсй = Т()); йпс пайп() ( й (1); // ПРАВИЛЬНО: выводится, что Т = Тпг б<1опд>(2); // ПРАВИЛЬНО: Т = 1опд; вывод не используется й<сЬаг>(); // ПРАВИЛЬНО: то же, что и б«сЬат>(' 10 '); б(); // То же, что и й<йопЬ1е>(0.0); Здесь аргументу шаблона по умолчанию позволено использовать аргумент функции по умолчанию без явного указания аргументов шаблона. 13.4. Строковые литералы и выражения с плавающей точкой в качестве аргументов... 235 13.4. Строковые литералы и выражения с плавающей точкой в качестве аргументов шаблонов Пожалуй, и для начинающих, и для опытных программистов, пишущих шаблоны, самое удивительное из всех ограничений на аргументы шаблонов, не являющиеся типами, состоит в том, что строковый литерал невозможно использовать в качестве аргумента шаблона.

Приведенный ниже пример интуитивно понятен. семр1аге <с)таг сопла* мвс> с1авв Шауповег ( рпЫ 1с: чозс) ргзпс (); 3.пг ваап() ( Мадповег<"япгргзве!">().ргзпа(); Однако здесь есть ряд потенциальных проблем. В стандартном языке С++ два экземпляра класса Шауповег будут принадлежать одному и тому же типу тогда и только тогда, когда у них одни н те же аргументы. В данном случае аргумент является указателем, другими словами — адресом. Однако у двух идентичных строковых литералов, расположенных в разных местах исходного кода, не обязательно должен быть один и тот же адрес. Таким образом, можно оказаться в неловкой ситуации, когда классы Шаспоеег< "Х" > н Шадповег< "Х" > будут представлять два разных несовместимых типа! (Обратите внимание, что "Х" имеет тип с)заг сопят [2), но когда он передается в качестве аргумента шаблона, его тип сводится к с)заг сопвг*.) Исходя из этих (и других, связанных с ними) соображений, в стандартном языке С++ запрещено использовать строковые литералы в качестве аргументов шаблонов.

Однако в некоторых реализациях такая возможность существует в виде расширения. Это обеспечивается использованием содержимого строковых литералов во внутреннем представлении экземпляра шаблона. Хотя это вполне осуществимо, некоторые толкователи языка С++ полагают, что не являющийся типом параметр шаблона, который может замешаться строковым литералом, должен обьявляться иначе, чем параметр, который может замешаться адресом. Однако на момент написания книги синтаксис такого объявления, котоРый получил бы широкую поддержку, отсутствовал. Кроме того, следует отметить, что в данном вопросе кроется один дополнительный технический недостаток.

Рассмотрим следующие объявления шаблонов и предположим, что язык расширен так, чтобы строковые литералы могли использоваться в качестве аргументов шаблонов. 23б Глава 13. Направления дальнейшего развития гешр1асе <спаг сопеть ясг> с1аяя Вгас)сес ( райс: всагйс сЬаг сопят* аг)бгеяя() сопят; ягас1с сЬаг сопяс* Ьусея() сопясу ); сетр1аге <сЬаг сопяс* ясг> сЬаг сопят* Вгас)сег<Т>::ас)йгеяя() сопвг ( гесигп яггу ) геар1аге <сЬаг сопят* ягг> сЬаг сопясь Вгас)сее<Т>::Ьусея() сопят гесигп ятг; В этом коде две функции-члена идентичны во всем, кроме своих имен, — ситуация не такая уж и редкая. Предположим, что некоторая реализация инстанцирует Вгас)сес<")("> с помощью процесса, подобного макрорасширению: тогда, если эти две функции-члена инстанцируются в разных программных модулях, они могут возвращать разные значения. Интересно, что тестирование некоторых компиляторов языка С++, имеющих данное расширение, показало, что они обладают таким удивительным недостатком.

С этим вопросом связан и вопрос о возможности использования литералов с плавающей точкой (и простых константных выражений с плавающей точкой) в качестве аргументов шаблонов. Сетр1асе <с)оиЫе Кае1о> с1авв Сопчеггег ( райс: япасйс допь1е сопчеге(6оиЫе ча1) сопят ( гегпгп ча1*Касйо; ) Суре<)ей Сопчегпег<0.0254> ХпсЬТоМееег; Эта возможность также имеется в некоторых реализациях языка С++, и она не представляет собой серьезной технической задачи (в отличие от использования строковых литералов в качестве аргументов). 13.5. Менее строгие правила соответствия для шаблонных параметров шаблона 237 13.5. Менее строгие правила соответствия для шаблонных параметров шаблона Шаблон, используемый для подстановки вместо шаблонного параметра шаблона, дшпкен точно соответствовать списку параметров данного шаблонного параметра.

Как видно нз следующего примера, иногда зто может приводить к удивительным последствиям. ()Тпс1цс(е <11вг> // Содержит объявление: // пашеврасе вес) ( // Еешр1аге <Гурепаше Т, // сурепаше А11осагог = а11осаеог<Т» // с1авв 11вг; // сешр1асе< сурепаше т1, Сурепаше Т2, гепр1аге<сурепаше> с1авв сопга1пег> // Ожидается, что Сопгайпег — шаблон // только с одним параметром с1авв Ке1аейоп ( ри)з11с: ргйчаге: Сопсайпег<Т1> с)ош1; Сопсайпег<Т2> с(ош2; Тпе пайп() ( Ке1ас1оп<хпг, с(ои)э1е, зЫ::11вг> ге1; // ОШИБКА: зсй::11вс имеет более // одного параметра шаблона Эта программа ошибочна, поскольку в качестве параметра Сопгайпег ожидается шаблон с одним параметром, тогда как вес):: 11вс содержит параметр а11осасог в дополнение к параметру, определяющему тип элемента.

Однако, поскольку зеб:: 11зг имеет Лля параметра а11осагог значение по умолчанию, можно было бы установить, что Сопга1пег соответствует вес):: 11вс и что каждое инстанцирование класса Сопеайпег использует аргумент шаблона по умолчанию из вес):: 11з г (см. раздел 8.3.4, стр. (35). Аргументом в пользу необходимости сохранять статус-кво (т.е. несоответствие) является то, что для определения соответствия типов функций применяется такое же правило. Однако в этом случае используемые по умолчанию аргументы не всегда могут быть определены, так как значение указателя на функцию обычно не устанавливается до вре- 238 Глава 13. Направления дальнейшего развития мени выполнения.

В противоположность этому "указателей на шаблоны" не существует и вся необходимая информация доступна во время компиляции. В некоторых компиляторах языка С++ менее строгое правило соответствия уже реализовано в виде расширения. Этот вопрос связан также с вопросом шаблонных гуредеб (они рассматриваются в следующем разделе). Действительно, попробуем заменить определение функции ша1п ( ) из предыдущего примера следующим: Гешр1асе <Гурепаше Т> Гурес(еб 11вс<Т> Иу( 1вс; 1пг па1п() ( Пе1ас1оп<1пс, ЙоиЫе, Иу( 1вс> ге1; ) Конструкция куреней вводит новый шаблон, который теперь точно соответствует классу Сопга1пег в плане списка параметров. Как трактовать данный пример: в пользу менее строгого правила соответствия нли против него — зто, конечно, вопрос спорный.

Данный вопрос поднимался перед Комитетом по стандартизации языка С++, но в настоящее время Комитет не склонен вводить менее строгое правило соответствия. 13.6. Фурейе$'-шаблоны ' Шаблоны классов часто комбинируются довольно сложными способами для получения других параметризованных типов. Когда такие параметризованные типы часто повторяются в исходном коде, возникает естественное желание ввести для них сокращенную запись, так же как конструкции сурес(ей дают сокращенную запись синонимов не- параметризованных типов. Поэтому разработчики языка С++ думают о введении конструкции, которая могла бы выглядеть следующим образом: гетр1аге <гурепвзве т> суредеб чесгог<11вг<т» таЫе; После данного объявления ТаЫе будет новым шаблоном, который может быть инстанцирован и стать определением конкретного типа Такой шаблон называется гуреИеУ- шаблоном (в отличие от шаблона класса или шаблона функции).

Например: ТаЫе<1цс> Гз /I Г имеет тип чессог<11вс<1пс» В настоящее время отсутствие гурег(ей-шаблонов обходят путем использования конструкций гурией, являющихся членами шаблонов классов. В нашем примере мож. но было бы сделать так: Сешр1асе <Сурепке Т> с1авв ТаЬ1е ( риЫ1с: 13.7. Частичная специализация шаблонов функций 239 сурейей чессог<11ве<Т» Туре> ТаЬТе<йпе>::Туре с; //с имеет тип чессог<11зс<йпс» Поскольку шаблоны суребей являются полноценными, они могут специализироваться во многом подобно шаблонам классов. // Первичный шаблон Суре<)ей: СЕВр1аСЕ<еурЕПаВЕ Т> сурЕС)ЕЙ Т ОрадцЕ; // Частичная специализация: севр1асе<сурепаве Т> еурес)ей чоЫ* Орадце<Т*>у // Полная специализация: Севр1асе<> Сурес(ей Ьоо1 Орадце<чоЫ>; Шаблоны суре<)ех не так уж просты.

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

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

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

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