Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

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

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

Шаблон функцiї - це узагальнене визначення, з якого компiлятор може

автоматично генерувати код (створити представника) функцiї. Синтаксис шаблона функцiї має наступний вигляд:

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

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

{

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

}

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

Приклади:

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ї

}

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

Приклад:

#if !defined(__SORTTPL_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

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

оголошення.

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

Пiсля визначення шаблону функцiї можна зразу її викликати:

компiлятор автоматично створить представик тiла функцiї для викликiв, де конкретизуються параметри.

#include <iostream.h>

#include "sorttmp1.h" //містить шаблон функцiї sort

int main (void )

{

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

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

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

cout << "iarray[" << i <<"]="<< iarray[i]<< end1;

return 0;

}

Шаблон sort можна використовувати i для класiв користувача, якщо клас

перегружає операцiю '>' , яку використовують в шаблонi для порiвняння

елементiв.

Приклад:

class Amount

{

long dollars;

int cents;

public:

Amount( long _d, int_c )

{

dollars =_d;

cents =_c;

}

int operator > (const Amount& ) const;

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

};

int Amount::operator > ( const Amount& _amt )

{

return ( dollars > _amt.dollars ) ||

( dollars == _amt.dollars &&

cents > _amt.cents );

}

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

{

os << "$" << _amt.dollars << '.' << _amt.cents;

return os;

}

int main( void )

{

Amount amtArray[ ] = {

Amount( 19, 10 ),

Amount( 99, 99 ),

Amount( 99, 95 ),

Amount( 19, 95 ),

};

sort( amtArray, sizeof( amtArray )/sizeof( amtAarray[0] ) );

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

cout << "amtArray[" << i << "] = " << amtArray[i]<< end1;

return 0;

}

Шаблон функцiї є визначенням, з якого компiлятор може створювати

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