Программирование >>  Инициализация объектов класса, структура 

1 ... 155 156 157 [ 158 ] 159 160 161 ... 395


правильно: спецификатор после списка параметров template <typename Type> inline

Type min( Type, Type );

ошибка: спецификатор inline не на месте inline

template <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.3



определение шаблона функции min()

с параметром-типом Type и параметром-константой size

template <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 => 5 int 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 => 6 double d = min( da ); if ( d != 3.2 )

ut << ??oops: double min() failed\n ; cout << !!ok: double min() worked\n ;

else

return 0;

для массива из шести элементов типа double:

Вызов

int i = min ( ia );

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

10.2. Конкретизация шаблона функции

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



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 адресует именно ее.

Когда берется адрес шаблона функции, контекст должен быть таким, чтобы можно было однозначно определить типы и значения аргументов шаблона. Если сделать это не удается, компилятор выдает сообщение об ошибке:

приводит к конкретизации следующего экземпляра функции min() , в котором Type

int 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 );

конкретизирует экземпляр miin (), в котором Type заменено на double, а size на 6:

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

Шаблон конкретизируется либо при вызове, либо при взятии адреса функции. В следующем примере указатель pf инициализируется адресом конкретизированного экземпляра шаблона. Его аргументы определяются путем исследования типа параметра



1 ... 155 156 157 [ 158 ] 159 160 161 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика