Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бичков - Основи сучасного програмування.doc
Скачиваний:
69
Добавлен:
07.03.2016
Размер:
2.67 Mб
Скачать

8.1. Функціональні шаблони

8.1.1. Визначення й використання шаблонів функцій

Шаблон функцiї – це узагальнене визначення, з якого компілятор може автоматично генерувати код (створювати представника) функції. Синтаксис шаблона функції має такий вигляд:

template<список_аргументiв_шаблона>

тип_результату iм'я_функцiї(параметри...)

{ //Тiло функцiї

}

За ключовим словом template йдуть один чи кілька аргументів, які поміщені в дужки < > (вимога синтаксису) i відокремлені один від одного комами. Кожний аргумент складається з ключового слова class та ідентифікатора, який визначає тип. Потім записується визначення функції. Наприклад:

template<class T>

Void func(t t)

{

//тiло функцiї

}

template<class T>

void func_1(T t1,T t2 )

{

//тiло функцiї

}

template<class T1,class T2>

void func_2(T1 t1,T2 t2 )

{

//тiло функцiї

}

Розглянемо програму сортування елементів масиву. Використовуючи шаблон функції, можна написати таку програму для масиву будь-якого типу. Наприклад:

#if!defined(__SORTTMPL_H)

#define__SORTTMPL_H

template<class T>

void sort(T array[ ],size_t size)

{for(int i=0;i<size-1;i++)

for(int j=size-1;i<j;j--)

if(array[j-1]< array[j])

{T tmp=array[j];

array[j]=array[j-1];

array[j-1]=tmp;}

}

#endif//__SORTTMPL_H

Можна створити прототип шаблона функції у вигляді його попереднього оголошення:

template<class T>void sort(T array[ ],size_t size);

Після визначення шаблона функції можна одразу її викликати – компілятор автоматично створить представника тіла функції для викликів, де конкретизуються параметри:

#include <iostream.h>

int main(void)

{int myarray[ ]={30,27,45,10,23,7,4,89};

sort(myarray,sizeof(myarray)/sizeof(myarray[0]));

for(inti=0;i<sizeof(myarray)/sizeof(myarray[0]);i++)

cout<<"myarray["<<i<<"]="<<myarray[i]<<endl;

return 0;}

Шаблон sort можна використовувати i для класів користувача, якщо клас містить перевантажену операцію '<', яку застосовують у шаблоні для порівняння елементів. Наприклад:

class Prise

{long gryv;

int cop;

public:

Prise(long_g,int_c)

{gryv=_g;

cop=_c;}

int operator<(const Prise&);

friend ostream& operator<<(ostream &,Prise &);

};

int Prise::operator<(const Prise&_amt)

{return(gryv<_amt.gryv)||

(gryv==_amt.gryv && cop<_amt.cop);}

ostream& operator<<(ostream& os,Prise&_amt)

{os<<"UGR"<<_amt.gryv<<'.'<<_amt.cop;

return os;}

Int main(void)

{

Prise dollar[ ]={

Prise(5,10),

Prise(5,99),

Prise(4,95),

Prise(6,01)};

sort(dollar,sizeof(dollar)/sizeof(dollar[0]));

cout<<"Курс долара по роках:\n";

for(int i=0;i<sizeof(dollar)/sizeof(dollar[0]);i++)

cout<<"200"<<i<<"="<<dollar[i]<<endl;

return 0;}

Шаблон функції є визначенням, за яким компілятор може створювати функції. Функції, створені за шаблоном, називають іноді функціями шаблона, або шаблонними функціями.

8.1.2. Перевантаження шаблонів функції

Як i звичайні функції, функціональні шаблони можуть бути перевантажені. Наприклад:

template <class T>

T getMax(T t1,T t2)

{return t1>t2? t1:t2;}

template <class T>

T getMax(Tt[ ],size_t size)

{T max=t[0];

for(int i=0;i<size;i++)

if(t[i]>max)

max=t[i];

return max;}

Int main(void)

{int i1=3;

int i2=5;

int iarray[ ]={3,9,5,8};

cout<<"max int="<<getMax(i1,i2)<<end1;

cout<<"max int="<<getMax(iarray, sizeof(iarray)

/sizeof(iarray[0]))<<endl;

return 0;

}