Автор: Пьянков Денис ИТП-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(); } |