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

4.11.2. Шаблоны функций.

Шаблон функций (function template) является средством языка C++, позволяю­щим избежать рутинного переписывания кодов функций, которые имеют сход­ный алгоритм, но разные типы параметров. Классическим примером, иллюстрирующим выгоды шаблона, является множество реализаций функции max(a,b). При отсут­ствии механизма шаблонов для придания функции max универсального характера следует создать несколько функций, совмещающих одно и то же имя. Например:

long max (long a. long b):

double max (double a, double b):

Vector& max (Vector& a, Vector& b);

Очевидно, что тела всех функций могут выглядеть совершенно одинаково для многих типов параметров. Например, коды могут иметь вид:

return (a>b) ? a : b;

В таких случаях удобно использовать шаблон функции. Шаблон задается клю­чевым словом template:

template <class Т> Т max(T х, Т у)

{

return (х>у) ? х : у;

};

Здесь <class T> является аргументом шаблона. Символ Т (type) означает про­извольный тип данных Т, который будет задан при использовании шаблона. Символ Т выполняет роль формального параметра, поэтому сам этот символ может быть и другим, но везде одинаковым. При фактическом использовании шаблона место Т заменяет какой-то уже описанный тип. Им может быть как стандартный тип языка, так и новый тип, определенный пользователем. В том числе он может быть и именем класса, определенного ранее. Важно, чтобы для типа был опреде­лен смысл операции > («больше»). Если Т заменяется классом, то в классе должен быть предварительно реализован operator>(). Компилятор генерирует подходящие коды функции max в соответствии с конкретными типами фактических параметров, использованных при вызове функции. Например, встретив во внешней функции коды:

Vector a(2,1), b(0,4), с;

с = max (a, b);

printf ("\n Норма вектора c=max(a,b) = %6.2f",!c);

компилятор в сгенерированной по заданному шаблону копии функции mах() (при сравнении объектов класса Vector) использует функцию operator>(), которая была определена в классе Vector:

bool operator >(Vector& v)

{return !*this > !v;}

Если в той же внешней функции встретится оператор:

printf ("\n max (10,11) = %d",max (10,11)),

то компилятор в другой копии функции max, сгенерированной по тому же шаблону, использует операцию >, определенную для стандартного типа данных int. Один раз написав шаблон функции max, мы можем вызывать ее для всех типов данных, для которых определена функция operator>(). Если для какого-то типа данных существующая версия тела функции max не годится, то можно отменить (override) действие template функции для этого типа. Например, определив функцию:

char* max (char* s. char *t)

{

return (strcmp (s. t) > 0) ? s : t;

}

мы отменяем действие шаблона для символьных строк, так как функция, скроен­ная по шаблону, осуществляла бы ничего не значащее сравнение указателей s и t.

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

double max (double, double);

можно вызывать с аргументами (int, double) или (float, long). Компилятор авто­матически преобразует параметры к типу double. Однако, если явная декларация функции, скрывающей шаблон, отсутствует, то шаблон

template <class Т> Т тах(Т х. Т у)

не позволит смешивать типы при вызове функции. Таким образом обращение

int i=max(9,8.);

вызывает сообщение об ошибке, которое информирует вас, что не найдена функция max для пары аргументов типа (int, double).