Главная » Просмотр файлов » С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс

С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (1114944), страница 80

Файл №1114944 С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс) 80 страницаС.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (1114944) страница 802019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Так, все три// все три объявления min() относятся к одному и тому же шаблону функции// опережающие объявления шаблонаtemplate <class T> T min( T, T );template <class U> U min( U, U );// фактическое определение шаблонаtemplate <class Type>объявления min() относятся к одному и тому же шаблону функции:Type min( Type a, Type b ) { /* ...

*/ }Количество появлений одного и того же параметра шаблона в списке параметровфункции не ограничено. В следующем примере Type используется для представления#include <vector>// правильно: Type используется неоднократно в списке параметров шаблонаtemplate <class Type>двух разных параметров:Type sum( const vector<Type> &, Type );Если шаблон функции имеет несколько параметров-типов, то каждому из них должно// правильно: ключевые слова typename и class могут перемежатьсяtemplate <typename T, class U>T minus( T*, U );// ошибка: должно быть <typename T, class U> или//<typename T, typename U>template <typename T, U>предшествовать ключевое слово class или typename:T sum( T*, U );472С++ для начинающихВ списке параметров шаблона функции ключевые слова typename и class имеютодинаковый смысл и, следовательно, взаимозаменяемы.

Любое из них можетиспользоваться для объявления разных параметров-типов шаблона в одном и том жесписке (как было продемонстрировано на примере шаблона функции minus()). Дляобозначения параметра-типа более естественно, на первый взгляд, употреблять ключевоеслово typename, а не class, ведь оно ясно указывает, что за ним следует имя типа.Однако это слово было добавлено в язык лишь недавно, как часть стандарта C++,поэтому в старых программах вы скорее всего встретите слово class. (Не говоря уже отом, что class короче, чем typename, а человек по природе своей ленив.)Ключевое слово typename упрощает разбор определений шаблонов.

(Мы лишь краткоостановимся на том, зачем оно понадобилось. Желающим узнать об этом подробнеерекомендуем обратиться к книге Страуструпа “Design and Evolution of C++”.)При таком разборе компилятор должен отличать выражения-типы от тех, которыетаковыми не являются; выявить это не всегда возможно. Например, если компиляторвстречает в определении шаблона выражение Parm::name и если Parm – это параметртип, представляющий класс, то следует ли считать, что name представляет член-типtemplate <class Parm, class U>Parm minus( Parm* array, U value ){Parm::name * p;// это объявление указателя или умножение?// На самом деле умножениекласса Parm?}Компилятор не знает, является ли name типом, поскольку определение класса,представленного параметром Parm, недоступно до момента конкретизации шаблона.Чтобы такое определение шаблона можно было разобрать, пользователь долженподсказать компилятору, какие выражения включают типы.

Для этого служит ключевоеслово typename. Например, если мы хотим, чтобы выражение Parm::name в шаблонефункции minus() было именем типа и, следовательно, вся строка трактовалась какtemplate <class Parm, class U>Parm minus( Parm* array, U value ){typename Parm::name * p;// теперь это объявление указателяобъявление указателя, то нужно модифицировать текст следующим образом:}Ключевое слово typename используется также в списке параметров шаблона дляуказания того, что параметр является типом.Шаблон функции можно объявлять как inline или extern – как и обычную функцию.Спецификатор помещается после списка параметров, а не перед словом template.473С++ для начинающих// правильно: спецификатор после списка параметровtemplate <typename Type>inlineType min( Type, Type );// ошибка: спецификатор inline не на местеinlinetemplate <typename Type>Type min( Array<Type>, int );Упражнение 10.1Определите, какие из данных определений шаблонов функций неправильны.

Исправьте(a) template <class T, U, class V>void foo( T, U, V );(b) template <class T>T foo( int *T );(c) template <class T1, typename T2, class T3>T1 foo( T2, T3 );(d) inline template <typename T>T foo( T, unsigned int* );(e) template <class myT, class myT>void foo( myT, myT );(f) template <class T>foo( T, T );(g) typedef char Ctype;template <class Ctype>ошибки.Ctype foo( Ctype a, Ctype b );Упражнение 10.2(a) template <class Type>Type bar( Type, Type );template <class Type>Type bar( Type, Type );(b) template <class T1, class T2>void bar( T1, T2 );template <typename C1, typename C2>Какие из повторных объявлений шаблонов ошибочны? Почему?void bar( C1, C2 );Упражнение 10.3474С++ для начинающихПерепишите функцию putValues() из раздела 7.3.3 в виде шаблона.

Параметризуйте еготак, чтобы было два параметра шаблона (для типа элементов массива и для размерамассива) и один параметр функции, являющийся ссылкой на массив. Напишитеопределение шаблона функции.10.2. Конкретизация шаблона функцииШаблон функции описывает, как следует строить конкретные функции, если заданомножество фактических типов или значений. Процесс конструирования называетсяконкретизацией шаблона.

Выполняется он неявно, как побочный эффект вызова иливзятия адреса шаблона функции. Например, в следующей программе min()конкретизируется дважды: один раз для массива из пяти элементов типа int, а другой –// определение шаблона функции min()// с параметром-типом Type и параметром-константой sizetemplate <typename Type, int size>Type min( Type (&r_array)[size] ){Type min_val = r_array[0];for ( int i = 1; i < size; ++i )if ( r_array[i] < min_val )min_val = r_array[i];return min_val;}// size не задан -- ok// size = число элементов в списке инициализацииint ia[] = { 10, 7, 14, 3, 25 };double da[6] = { 10.2, 7.1, 14.5, 3.2, 25.0, 16.8 };#include <iostream>int main(){// конкретизация min() для массива из 5 элементов типа int// подставляется Type => int, size => 5int i = min( ia );if ( i != 3 )cout << "??oops: integer min() failed\n";else cout << "!!ok: integer min() worked\n";// конкретизация min() для массива из 6 элементов типа double// подставляется Type => double, size => 6double d = min( da );if ( d != 3.2 )cout << "??oops: double min() failed\n";else cout << "!!ok: double min() worked\n";return 0;для массива из шести элементов типа double:}Вызовint i = min( ia );475С++ для начинающихприводит к конкретизации следующего экземпляра функции min(), в котором Typeint min( int (&r_array)[5] ){int min_val = r_array[0];for ( int i = 1; i < 5; ++i )if ( r_array[i] < min_val )min_val = r_array[i];return min_val;заменено на int, а size на 5:}Аналогично вызовdouble d = min( da );конкретизирует экземпляр min(), в котором Type заменено на double, а size на 6:В качестве формальных параметров шаблона функции используются параметр-тип ипараметр-константа.

Для определения фактического типа и значения константы, которыенадо подставить в шаблон, исследуются фактические аргументы, переданные при вызовефункции. В нашем примере для идентификации аргументов шаблона при конкретизациииспользуются тип ia (массив из пяти int) и da (массив из шести double). Процессопределения типов и значений аргументов шаблона по известным фактическимаргументам функции называется выведением (deduction) аргументов шаблона. (Вследующем разделе мы расскажем об этом подробнее. А в разделе 10.4 речь пойдет овозможности явного задания аргументов.)Шаблон конкретизируется либо при вызове, либо при взятии адреса функции.

Вследующем примере указатель pf инициализируется адресом конкретизированногоэкземпляра шаблона. Его аргументы определяются путем исследования типа параметраtemplate <typename Type, int size>Type min( Type (&p_array)[size] ) { /* ... */ }// pf указывает на int min( int (&)[10] )функции, на которую указывает pf:int (*pf)(int (&)[10]) = &min;Тип pf – это указатель на функцию с параметром типа int(&)[10], который определяеттип аргумента шаблона Type и значение аргумента шаблона size при конкретизацииmin().

Аргумент шаблона Type будет иметь тип int, а значением аргумента шаблонаsize будет 10. Конкретизированная функция представляется как min(int(&)[10]), иуказатель pf адресует именно ее.Когда берется адрес шаблона функции, контекст должен быть таким, чтобы можно былооднозначно определить типы и значения аргументов шаблона. Если сделать это неудается, компилятор выдает сообщение об ошибке:476С++ для начинающихtemplate <typename Type, int size>Type min( Type (&r_array)[size] ) { /* ...

*/ }typedef int (&rai)[10];typedef double (&rad)[20];void func( int (*)(rai) );void func( double (*)(rad) );int main() {// ошибка: как конкретизировать min()?func( &min );}Функция func() перегружена и тип ее параметра не позволяет однозначно определить ниаргумент шаблона Type, ни значение аргумента шаблона size. Результатомmin( int (*)(int(&)[10]) )конкретизации вызова func() может быть любая из следующих функций:min( double (*)(double(&)[20]) )Поскольку однозначно определить аргументы функции func() нельзя, взятие адресаконкретизированного шаблона в таком контексте приводит к ошибке компиляции.Этого можно избежать, если использовать явное приведение типов для указания типаint main() {// правильно: с помощью явного приведения указывается тип аргументаfunc( static_cast< double(*)(rad) >(&min) );аргумента:}Лучше, однако, применять явное задание аргументов шаблона, как будет показано вразделе 10.4.10.3. Вывод аргументов шаблона АПри вызове шаблона функции типы и значения его аргументов определяются путемисследования типов фактических аргументов функции.

Этот процесс называется выводомаргументов шаблона.template <class Type, int size>Параметром функции в шаблоне min() является ссылка на массив элементов типа Type:Type min( Type (&r_array)[size] ) { /* ... */ }477С++ для начинающихДля сопоставления с формальным параметром функции фактический аргумент такжедолжен быть l-значением, представляющим тип массива. Следующий вызов ошибочен,void f( int pval[9] ) {// ошибка: Type (&)[] != int*int jval = min( pval );так как pval имеет тип int*, а не является l-значением типа “массив int”.}При выводе аргументов шаблона не принимается во внимание тип значения,возвращаемого конкретизированным шаблоном функции. Например, если вызов min()double da[8] = { 10.3, 7.2, 14.0, 3.8, 25.7, 6.4, 5.5, 16.8 };записан так:int i1 = min( da );то конкретизированный экземпляр min() имеет параметр типа “указатель на массив извосьми double” и возвращает значение типа double. Перед инициализацией i1 этозначение приводится к типу int.

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

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

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

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