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

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

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

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

// Ьав1сз/зсасК8севе.Ьрр №1пс1ис)е <1озегеащ> №1пс1пс(е <зсгйпд> №1пс1ис)е <свМ11Ь> №1пс1ис(е <чессог> №1пс1ис)е "зсасК8.Ьрр" 1пс ща1п() ( 1.4. Шаблонные параметры шаблонов 77 ггу ( ЯгасК<йпг> 1пСЯСас)с // Стек целочисленных // значений ЯсасК<Х1оаг> б1оасЯгасК? // Стек значений // с плавающей точкой // Работа со стеком целочисленных значений 1пСЯсасК.рцз)з(42); 1псЯсасК.рцз)з(7); // Работа со стеком значений с плавающей точкой й1оаГЯСасК.рцз?з(7.7); // Присвоение стеков с разными типами Е1оагЯгасК = 1пгЯгасК; // Вывод стека Е1оаг вес)::сонг « б1оагЯгасК.сор() « згс?::епс)1; Е1оаСЯГасК.рор(); зсг?::соцс « й1оаСЯГасК.сор() « вес)г:епс?1; й1оагягасК.рор(); зсс)::соцс « Й1оаСЯСасК.Сор() « зМ::епг)1? ) сакс?г (вес)::ехсерс?оп сопела ех) ( згд:: сегг«" Ехсерейоп: " «ех.н)заг () «зсг):: епс)1/ // Стек целочисленных значений, в котором в качестве // внутреннего контейнера используется вектор ЯсасК<йпс,всг?::чессог> чЯГасК> чЯсасК.рив)з(42); чЯгасК.рцв?з(7); вМг:соцс « чЯгасК.сор() « вМ::епс)1; чЯгасК.рор()г Программа дает следующий вывод: 7 42 Ехсерсйоп: якасК<>::Гор(): ещрсу згасК 7 Заметим, что шаблонные параметры шаблонов — одна из наиболее современных функциональных возможностей, которую должны обеспечивать компиляторы, соответствующие стандарту.

Таким образом, приведенная выше программа является хорошим тестом того, насколько ваш компилятор отвечает современным требованиям в области шаблонов. Глава 5. Основы работы с шаблонами 78 Продолжение обсуждения данной темы и примеры шаблонных параметров шаблонов вы найдете в разделах 8.2.3, стр. 126, и 15.1.б, стр. 287. 5.5. Инициализация нулем Для базовых типов данных, таких, как хпс, г)опЬ1е или указатели, не существует стандартного конструктора, который инициализировал бы эти величины каким-либо полезным значением по умолчанию.

Напротив, каждая неинициализированная локальная переменная имеет неопределенное значение. Теперь допустим, что мы пишем шаблоны и хотим иметь переменные типа шаблона, инициализированные значением по умолчанию. Тогда у нас возникает проблема: ведь с помощью простого определенна для встроенных типов этого сделать нельзя. сешр1аее <сурепке Т> чоЫ йоо() ( Т х; // Значение х не определено, // если Т вЂ” встроенный тип ) По этой причине для встроенных типов можно явно вызывать стандартный конструктор, ко- торый инициализирует их нулем (или значением Еа2зе для величин типа Ьоо1), т.е.

хпс () дает нуль. Следовательно, можно обеспечить соответствующую инициализацию по умолча- нию даже для встроенных типов. Для этого нужно использовать приведенный ниже код. Сетр1аге <Сурепате Т> чоЫ йоо() ( Т х = Т()/ // Значение х равно О (или Еа1зе) // если Т вЂ” встроенный тип Для гарантии того, что член шаблонного класса, имеющий параметризованный тип, будет инициализирован, следует определить конструктор по умолчанию, который использует список инициализации членов класса. Севр1асе <сурепазае Т> с1азз МУС1азз ( ргЫаеез Т х; хс) ~ос» ( хпс х; зле* рсд; // Значение х не определено // рог указывает неизвестно на что // (но не в никуда!) 5,б. Использование строковых литералов в качестве аргументов шаблонов функций 79 рцЬ11с: МуС1авв() : х() ( // Гарантируется, что х // будет проинициализирован // даже для встроенных типов ) 5.6.

Использование строковых литералов в качестве аргументов шаблонов функций с В том случае, когда шаблон функции имеет параметры ссылочного типа, передача аргументов, являющихся строковыми литералами, может вызвать неожиданные ошибки при работе программ. Рассмотрим пример. // Ьавйсв/пшх5.Ьрр ()1пс1цде <вггйпд> // Обратите внимание на ссылочные параметры Тп11пе Т сопвсй гаах(Т сопвей а, Т сопвей Ь) гегигп а < Ь ? Ь : а; Тпс ща1п() ( вес)::вгг1пд в; ::шах("арр1е","реасЬ")з // ВЕРНО: тип одинаков ::пах("арр1е","созааго")( // ОшиБкА: типы равные ::гаах("арр1е",в); // ОШИБКА: типы равные ) Проблема заключается в том, что в зависимости от длины строковые литералы имеют Разные типы, т.е.

являются разными массивами. Другими словами, "арр)е" и "раас(з" имеют тнп сЬаг сопле (6), в то время как '1ошасо" — тип сЬаг сопвг (7) . Карре«тным является только первый вызов функции, поскольку шаблон предполагает, что оба параметра имеют одинаковый тип. Однако если будут обьявлены параметры не ссылочного типа, то вместо них можно подставить строковые литералы разного размера. // Ьав1св.пахб.срр ()Тпс1ибе <вгг1пд> // Обратите внимание: параметры не ссылочного типа Глава 5.

Основы работы с шаблонами 80 ::зпах("арр1е","реасЬ")г ::пшх("арр1е","совало"); ::шах("арр1е", в); ) Объясняется зто следующим образом: в процессе вывода аргументов преобразование из массива в указатель (часто называемое сведением (Йесау)) происходит только в том слу- чае, если параметр имеет не ссылочный тип. Это показано на примере приведенной ниже программы. // Ьав1св/гейпогей.срр №1пс1ис)е <Гуребпбо> №1пс1цс)е <Товггеам> Гетр1асе <Сурепаме Т> чоЫ геб (Т сопвсй х) ( всй::соцс « "х Тп ген(Т сопвса): «суреЫ(х) .паше() « ' ~п'; сетр1асе <сурепаше Т> тоЫ попкам(Т х) ( вМ::сонг « "х Тп донген(Т): « суреЫ(х).паве() « '~п'; В данном примере аргумент, представляющий собой строковый литерал, перелается шаблонам функций, параметры которых объявлены как параметры ссылочного и не ссы- гешр1асе <сурепке Т> Тп11пе Т шах(Т а, Т Ь) ( гегпгп а < Ь ? Ь : а; Тпг.

майн() ( вгг)::вггйпд в; Тпс гаа1п() ( ген ( "Ье11о" ); донген("Ье11о")г ) // ВЕРНО: тип одинаков // ВЕРНО: сведение массивов // до одинаковых типов // ОШИБКА: типы разные 5 б Использование строковых литералов в качестве аргументов шаблонов функций 81 лочного типов соответственно. В обоих шаблонах функции для вывода на экран информации о типах сгенерированных экземпляров параметров используется оператор Турезг], который возвращает 1ча]пе типа вгт[:: Туре 1пго; это значение инкапсулирует представление типа выражения, передаваемого оператору Турезс[. Функция-член паше () класса вссЬ т ТУРе 1ПТО ПРедназначена для возвращениЯ понятного человеку текстового представления этого типа.

На самом деле в стандарте С++ не сказано, что функция паше () должна возвращать что-либо осмысленное, но в хороших реализациях С++ вы должны получить стРоку, котораЯ содержит описание типа выражения, переданного Турезс] (в некоторых реализациях эта строка возвращается во внутреннем кодированном (люля]ет[) представлении, однако существуют средства для преобразования такой строки в форму, понятную человеку). Например, вывод программы может иметь следующий вид: х зп гег(Т сопвгь) т сЬаг[б] х зп попгег[Т): сопяТ сЬаг* Проблема несоответствия между массивом символов и указателем на символы, если вам придется с ней столкнуться, может оказаться неожиданным препятствием в работез. К сожалению, универсального способа решения этой проблемы не существует.

В зависимости от контекста, можно прибегнуть к одному из перечисленных ниже способов. ° Использование вместо ссылок значений, не являющихся таковыми (однако это может повлечь за собой лишнее копирование). ° Перегрузка, позволяющая использовать как параметры ссьшочного типа, так и параметры не ссьшочного типа (однако это может привести к неоднозначности (см. раздел Б.2.2, стр. 510). ° Перегрузка для конкретных типов данных (таких, как вТс[:: в Тгзпд). ° Перегрузка для массивов, например: Тешр2аге <Турепатпе Т, зпТ М, 1пТ М> Т сопвТ* шах (Т сопвТ (йа][М], Т сопвТ (йЬ)[М)) ( гегпгп а < Ь 7 Ь т ат ) ° Использование прикладными программистами явного преобразования типов.

Для данного примера лучше всего подходит перегрузка шах( ) для строк (см. раздел 2.4, стр. 37). Это необходимо в любом случае, поскольку без перегрузки при вызове шах() для строковых литералов будет происходить сравнение указателей: сравнение а < Ь означает сравнение адресов двух строковых литералов, что ничего не дает в пла- з Именно по этой причине срелствами первоначальной стандартной библиотеки С++ нельзя было создать пару значений, ииипиализируемую строковыми литералами: асс): плахе рагг("Кеу", "чазие" ) т // ОШИБКА согласно [31) Эта ошибка была исправлена в первом списке технических опечаток посредством замены параметров ссылочного типа в такер азг параметрами не ссыпочиото типа [32].

Глава 5. Основы работы с шаблонами 82 не упорядочения по алфавиту. Это еще одна причина, по которой в большинстве случарв следует отдавать предпочтение строковому классу наподобие всс1::всг1пд пер~я строками в С-стиле. Более подробно этот вопрос рассматривается в разделе 11.1, стр. 193. 5.7. Резюме ° Для обращения к имени типа, которое зависит от параметра шаблона, следует предварить его ключевым словом суринаме. ° Вложенные классы и функции-члены также могут быть шаблонами. Одним из применений этой возможности является реализация обобщенных операций с преобразованиями внутренних типов (проверка типов при этом не устраняется).

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

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

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

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