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

Як 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;

}

Cпецiалiзованi функцiї шаблона

Спеціалізована функція шаблона – це звичайна функція, ім'я якої збігається з іменем функції у шаблоні, але яка визначається для параметрів специфічних типів. Можна визначати спеціалізовані функції шаблона для випадків, коли узагальнений шаблон не придатний для деякого типу даних. Наприклад, функція шаблона getMax не може використовуватися для рядків (char*, char[]), оскільки код, який генерується компілятором, просто буде порівнювати їх положення у пам'яті. Наприклад:

template<class T>

T getMax(T t1,T t2)

{return t1>t2? t1:t2;}

char*getMax(char*s1,char*s2)

{return strcmp(s1,s2)>0? s1:s2;}

int main(void){

int i1=3;

int i2=5;

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

char*s1="Golden Eagle";

char*s2="Peligrime Falcon";

cout<<"max str="<<getMax(s1,s2)<<end1;

return 0;}

Коли компілятор зустрічає виклик функції, то виконує такі дії:

a знаходить функцію (не шаблонну), параметри якої відповідають указаним у виклику;

a якщо функція не знайдена, то знаходить шаблон, з якого можна згенерувати функцію з точною відповідністю до параметрів;

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

Шаблони класів

Визначення шаблонів класу

Шаблон класу дає узагальнене визначення сім'ї класів, що використовує довільні типи чи константи. Шаблон визначає елементи даних та елементи-функції класу. Після визначення шаблона класу ми можемо вказати компілятору на необхідність генерувати на його основі новий клас для конкретного типу чи константи. Синтаксис шаблона класу має такий вигляд:

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

Class iм'я_класу

{

//поля даних і функції-члени

};

За ключовим словом template йдуть один чи кілька аргументів, поміщених у дужки < > i відокремлених один від одного комами. Кожний аргумент є або ім'ям типу, за яким іде ідентифікатор, або ключовим словом class, за яким іде ідентифiкатор типу.

Параметри шаблона, що складаються з ключового слова class та ідентифікатора, називають параметрами типу. Вони інформують компілятор про те, що шаблон пропонує тип як аргумент. Параметри шаблона, що складаються з імені типу та ідентифікатора, називаються нетиповими. Вони інформують компілятор про те, що аргументом виступає константа. Наприклад:

const size_t defStackSize=512;

template<class T>

Class Stack

{public:

Stack(size_t size=defStackSize)

{numitems=0;

items=new T[size];}

~Stack()

{delete[ ]items;}

void push(T t);

T pop();

protected:

int numitems;

T*items;};

template<class T>

void Stack<T>::push(T t)

{items[numitems++]=t;

}

template<class T>

T Stack<T>::pop()

{return items[--numItems];}

У наведеному прикладі реалізовано клас для роботи стеку. У даному випадку визначається шаблонний клас, у якому фігурує невідомий тип даних Т. Якщо функція визначається як невбудована, то її заголовок має такий формат:

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

тип_результату iм'я_класу<арг_шаблона>::iм'я_функцiї(параметри...)

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

Можна використовувати ключове слово inline для визначення вбудованого методу ззовні шаблона:

template<class Type>

inline void className<Type>::methodName(int i)

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: