Язык С++ для системного программирования. Имена-этикетки. Класс как область действия, страница 23

При написании программы на С++ может возникнуть необходимость создать несколько функций, которые выполняют одни и те же действия, но с данными разных типов. Например, нужно создать функции, определяющие максимальные элементы для массивов 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);

}