Перегрузка шаблонов функций
Можно перегружать функции-шаблоны для неподходящих под данный код шаблона данных, т.к. их использование базируется, как и у обычных функций, на распознавании компилятором различий в списках их параметров.
Кроме того, т.к. код шаблона не меняется, лучше его оформлять отдельным заголовочным файлом, а в функции, которая его использует, подключать его на этапе препроцессорной обработки.
Приведем пример перегрузки шаблонов, состоящей из ограничения использования функции 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]);
}
Дата добавления: 2014-12-30; просмотров: 737;