Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метода по ОАиП.doc
Скачиваний:
12
Добавлен:
11.05.2015
Размер:
3.21 Mб
Скачать

Перегрузка шаблонов функций

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

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

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

Перегрузка шаблона создается путем явного его определения (специализированная функция) для конкретного типа данных.

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

Шаблон функции поиска максимума будет иметь следующий вид:

template <class T>

T max(T x, T y) {

return (x>y)? x : y;

}

Специализированная функция выбора максимальной из двух строк:

char* max(char* x, char* y) {

return (strcmp(x, y)>0) ? x : y;

}

Осуществляется следующая последовательность этапов выбора «экземпляра» перегруженных функций:

1) поиск специализированной (не шаблон) функции с совпадающим списком параметров, и в случае неудачи:

– поиск шаблона функции с точным соответствием списка параметров;

– поиск специальной функции по условию совпадения списка параметров после возможных преобразований типов;

2) поиск завершается выбором нужной функции при совпадении параметров экземпляра функции со списком передаваемых аргументов.

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

#include <stdio.h>

#include <string.h>

template <class T>

T max(T x, T y) {

return (x>y)? x : y;

}

char* max(char* x, char* y) {

return (strcmp(x, y)>0) ? x : y;

}

void main()

{

int a=7, b=5;

char c1=’a’, c2=’z’;

char s1[]=”one”, s2[]=”two”;

printf(“\n a=%d, b=%d, max=%d \n”, a, b, max(a, b));

printf(“\n c1=%c, c2=%c, max=%c \n”, c1, c2, max(c1, c2));

printf(“\n s1=%s, s2=%s, max=%s \n”, s1, s2, max(s1, s2));

}

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

Рассмотрим пример нахождения максимального значения в массивах с данными различных типов.

. . .

template <class T> Maxa(T *z, int n); // прототип шаблона

void main(void) {

int a[100], n;

printf("\n Input n < 100 : ");

scanf("%d", &n);

for( int i=0; i<n; i++) {

printf("\n a[%d] = ", i+1);

scanf("%d", &a[i]);

}

printf("\n Max int = %d ", Maxa(a, n));

// Вызывается функция Maxaдля типаint

double b[ ] = {0.22, 1.5, 0.88};

printf("\n Max double = %lf ", Maxa(b,3));

// Вызывается функция Maxaдля типаdouble

char Str[ ] = "ABC123abc";

printf("\n Max char = %c ", Maxa(Str, (int)strlen(Str)));

// Вызывается Maxaдля типаchar

}

// Код шаблона

template <class T>

T Maxa(T *z, int n) {

int imax = 0;

for(int i=1; i<n; i++)

if(z[i]>z[imax]) imax = i;

return(z[imax]);

}