|
Автор: Пьянков Денис ИТП-3-08 |
|
|
Шаблон функции задает единственное определение алгоритма функции, которое может использоваться для разных типов данных. Компилятор по вызовам функций автоматически создает из шаблона перегруженные функции с одинаковым кодом, но разными типами данных. Назначение шаблона:
Шаблон следует использовать в тех случаях, когда в программе используется один и тот же алгоритм для разных типов данных и запись этого алгоритма на языке С++ одинакова. Синтаксис определения шаблона функции: template <class имя1, class имя2, …,class имяn>
заголовок функции
{тело функции}
Синтаксис прототипа шаблона функции: template <class имя1, class имя2, …,class имяn> заголовок функции; где имя1, имя2, …,имяn… - имена параметрических типов шаблона, настраиваемых на конкретный тип аргумента при вызове функции. Параметрический тип может использоваться в шаблоне функции для объявления:
Все параметрические типы, введенные в шаблоне, должны обязательно использоваться в формальных параметрах шаблона. Использование параметрического типа только для локальных переменных и/или для возвращаемого шаблоном значения недостаточно. Пример программы удаления из числовых массивов чисел с заданным значением. Алгоритмы ввода, вывода и удаления элементов массивов оформлены в виде шаблонов функций. Шаблоны функций тестируются для трех массивов. #include <iostream.h>
#include <conio.h>
//Прототипы шаблонов функций
template <class t>
void input (t a[], int n);
template <class t>
void output (t a[], int n);
template <class t>
void del (t a[], int &n, t x);
void main()
{
int a[100], b[100];
float c[100];
int n; //количество чисел в массиве
int xi; //значение удаляемых из целочисленного массива чисел
float xf; //значение удаляемых из вещественного массива чисел
cout « "n_int? ";
cin » n;
input(a, n);
output(a, n); //вывод исходного массива
cout « "x_int? ";
cin » xi;
del (a, n, xi);
output(a, n); //вывод массива после удаления из него чисел
cout « "n_int? ";
cin » n;
input(b, n);
output(b, n); //вывод исходного массива
cout « "x_int? ";
cin » xi;
del(b, n, xi);
output(b, n); //вывод массива после удаления из него чисел cout<<”n_float? ”;
cin » n;
input(c, n);
output(c, n); //вывод исходного массива
cout « "x_float? ";
cin » xf;
del(c, n, xf);
output(c, n); //вывод массива после удаления из него чисел
getch();
}
//Определения шаблонов функций
template <class t>
void input (t a[], int n)
{
cout « "array: ";
for(int i = 0; i < n; ++i)
{
cin » a[i];
}
}
template <class t>
void output (t a[], int n)
{
if (n == 0) cout « " array is empty" « endl;
else
{
for (int i = 0; i < n; ++i)
{
cout « a[i] « " ";
}
cout « endl;
}
}
template <class t>
void del (t a[], int &n, t x)
{
int i, j;
j = 0;
for (i = 0; i < n; ++i)
{
if (a[i] != x)
{
a[j] = a[i];
j++;
}
n = j;
}
}
Первый вызов функции, например, input(a,n), приводит к созданию варианта функции ввода целочисленного массива. При повторном вызове функции с теми же типами фактических параметров, которые встречались ранее, например, input(b,n), компи-лятор не создает повторно код функции ввода массива целых чисел. В этом примере параметрический тип использовался только для формальных параметров. В следующем примере он используется и для локальной перменной шаблона функции. Пример программы вычисления средних значений числовых массивов разных типов: целого и вещественного. Алгоритм вычисления среднего оформлен в виде шаблона функции. #include <iostream.h>
#include <conio.h>
//Определение шаблона функции ввода массива
template <class t>
void input (t a[], int n)
{
cout « "array int ";
for (int i = 0; i < n; ++i)
cin » a[i];
}
//Определение шаблона функции вычисления среднего
template <class t>
float avg (t a[], int n)
{
t s = 0; // параметрический тип для локальной переменной
for(int i = 0; i < n; ++i)
{
s += a[i];
}
return (float)s / n;
}
void main()
{
int b[100];
float c[100];
int n;
cout « "n_b? ";
cin » n;
input(b, n);
cout « "avg_b = " « avg(b, n) « endl;
cout « "n_c? ";
cin » n;
input(c, n);
cout « "avgb = " « avg(c, n) « endl;
cout « "avgb = " « avg(b, 5);
getch();
}
|