Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пиппец 2.doc
Скачиваний:
106
Добавлен:
07.06.2015
Размер:
3.16 Mб
Скачать

Прототип шаблона функции

Вы можете создать прототип шаблона функции в виде его предварительного объявления. Такое объявление информирует компилятор о наличии шаблона, а также сообщает об ожидаемых параметрах. Например, прототип шаблона функции Sort будет выглядеть так:

template <class T> void Sort(T array[], Tsize size);

Имена формальных параметров шаблона могут не совпадать в предварительном объявлении и определении шаблона. Так, например, в следующем фрагменте и прототип шаблона, и определение шаблона относятся к одной и той же функции:

template <class T> T max(T, T);

. . .

template <class Type>

Type max(Type a, Type b)

{

if (a > b) return a; else return b;

}

Использование шаблона функции

Шаблон функции описывает, как конкретная функция может быть построена на основании одного или нескольких фактических типов. Компилятор автоматически создает представитель тела функции для указанных в вызове типов. Такой процесс называется конкретизацией. Он происходит при вызове шаблонной функции.

Например, в следующем примере функция min() конкретизируется дважды: один раз типом int и один раз типом double:

template <class Type>

Type min(Type a, Type b)

{

if (a < b) return a; else return b;

}

void main()

{

int x = 4, y = 5, z;

z = min(x, y);

double t = 6.56, r = 3.07, p;

p = min(t, r);

}

Специализация шаблонов функции

Специализированная функция шаблона – это обычная функция, имя которой совпадает с именем функции в шаблоне, но которая определяется для параметров специфических типов. Специализированные функции шаблона определяют в том случае, когда обобщенный шаблон не годится для некоторого типа данных. Например, функция шаблона min

template <class Type>

Type min(Type a, Type b)

{

if (a < b) return a; else return b;

}

не может применяться для строк (для типа char*) , так как генерируемый компилятором код будет просто сравнивать их положение в памяти (адреса). Для корректного сравнения строк можно определить специализированную функцию:

char* min(char* s1, char* s2)

{

if (strcmp(s1,s2)>0) return s2; else return s1;

}

Тогда обращаться к такой функции можно так же, как и к функции шаблона:

void main ()

{

int i1 = 3, i2 = 5;

cout << “max int = ” << max(i1, i2) << endl;

char* s1 = “Golden Eagle”;

char* s2 = “Perigrine Falcon”;

cout << “max str = “ << max(s1, s2) << endl;

}

Шаблоны классов

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

Синтаксис шаблона класса

template <<список аргументов шаблона>>

class <имя класса>

<тело класса>

За ключевым словом template следуют один или несколько аргументов (параметров), заключенных в угловые скобки и отделяемых друг от друга запятыми. Каждый аргумент может представлять собой ключевое слово class, за которым следует идентификатор, обозначающий параметризованный тип. Список аргументов шаблона не может быть пустым.

Затем следует определение класса. Оно аналогично определению обычного класса, за исключением того, что использует список аргументов шаблона.

Параметры шаблона, состоящие из ключевого слова class и следующего за ним идентификатора, часто называют параметрами типа. Другими словами, они информируют компилятор, что шаблон предполагает тип в качестве аргумента.