Визначення й використання шаблонів функцій
Шаблон функц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;}
Шаблон функції є визначенням, за яким компілятор може створювати функції. Функції, створені за шаблоном, називають іноді функціями шаблона, або шаблонними функціями.