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

Автор: Пьянков Денис
ИТП-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();
}
Предыдущая страница         Следующая страница
Сайт создан в системе uCoz