При написании программы на С++ может возникнуть необходимость создать несколько функций, которые выполняют одни и те же действия, но с данными разных типов. Например, нужно создать функции, определяющие максимальные элементы для массивов int иdouble. Или выполнять сортировку элементов массивов разных типов и т.д. В этих случаях удобно написать шаблон функции, по которому компилятор самостоятельно создает функцию для каждого из типов данных. При определении шаблона функции будут использоваться формальные типы данных, а при обращении к шаблону будут указываться соответствующие фактические типы данных.
Синтаксис шаблона функции имеет вид:
template<список_формальных_типов_шаблона>
тип_ результата имя_функции (параметры)
{
тело функции
}
За ключевым словом template следует один или несколько аргументов, заключенных в угловые скобки или отделенные друг от друга запятыми. Каждый аргумент состоит из ключевого слова class и идентификатора, обозначающего формальный тип. Затем следует определение функции. Оно похоже на обычное определение функции, за исключением того, что один или несколько параметров используют типы, специфицированные в списке аргументов шаблона.
Рассмотрим примеры использования шаблонов при создании функции нахождения суммы элементов одномерных массивов, а также их сортировки для разных типов данных.
Пример 1
#include <iostream.h>
template <class T>
T sum (T x [ ], int n)
{
T s = Ø;// s - переменная типа class T
for(int i = Ø; i < n; i ++)
s+= x [ i ];
return s;
}
/ *
Определен шаблон функции для вычисления суммы элементов одномерного массива
типа class T * /
void main( )
{
int m [ ] = {1,2,3,4,5,6,7,8,9,10};
int sum_int = sum (m,10);
/*Компилятор
создает по шаблону функцию sum для целого типа int */
cout << " sum_int = " <<sum_int << ' \n ';
float x [ ] = { -1, Ø, 2.5, -Ø.1, Ø.15};
float sum_float = s ( x, 5 );
/*Компилятор создает по шаблону функцию sum для типа float */
cout << "sum_float =" << sum_float << ' \n ' ;
}
Пример 2
Сортировка элементов одномерного массива методом "пузырька".
#include <iostream.h>
template <class T>
void sort ( T x [ ], int n)
{
Tv; // v -
переменная типа classT
for(int k = n-1; k>Ø; i + +)
for(int i=0;i<k;i++)
if(x [i + 1] < x [ i ])
{
v = x [ i + 1];
x [i+1] = x [ i ];
x [i] = v;
}
}
/*Определен шаблон функции сортировки элементов одномерного массива */
void main( )
{
int m [1Ø] = {1Ø, 1, 9, 2, 8, 3, 7, 4, 6, 5};
sort (m, 1Ø);
/*
Компилятор создает по шаблону функцию sortдля целого типа int. После
сортировки массив m имеет вид:
for(int i = Ø; i < 1Ø; i + +)
cout << " m [" << i << "] = " << m [ i ] << ' \ n ';
float x [ 5 ] = {5, -1, 4, -2, 3};
sort (x, 5);
/* Компилятор создает по шаблону функцию sort для типа float. После сортировки массив ч имеет вид: */
for(i = Ø; i < 5; i + +)
count<< " x [" << i << "] = " << x [ i ] << ' \ n ';
}
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <malloc.h>
void read(double *a,int n){
for(int i=0;i<n;i++)
scanf("%lf",&a[i]);
}
void sum(double *a ,int n,double (*f)(double),double &A,double &B,double (*f1)(double)){
int i;
A=0;
for(i=0;i<n;i++)
A=A+(a[i]*(*f)(a[i]));
B=0;
for(i=0;i<n;i++)
B=B+(a[i]*(*f1)(a[i]));
}
void main(){
clrscr();
int n,m;
scanf("%d%d",&n,&m);
double *a=new double [n];
double *b=new double [m];
read(a,n);
read(b,m);
double A,B,C,D;
sum(a,n,&sin,A,B,&cos);
sum(b,m,&tan,C,D,&fabs) ;
double s=(A+B*sin(A))/(cos(D)+sin(C)) ;
printf("s=%lf",s);
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.