Шаблони функцій з кількома аргументами 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Шаблони функцій з кількома аргументами



Розглянемо інший приклад шаблону функції. В ньому три аргументи, два з яких шаблонні, а один – базового типу. Функція призначена для пошуку в масиві заданого числа. Вона повертає індекс знайденого значення або -1 у випадку відсутності в масиві. Аргументами є вказівник на масив; значення, яке треба знайти, а також розмір масиву. В main() ми визначаємо 4 різних масиви різних типів і 4 значення, які потрібно знайти. Тип char в даному прикладі сприймається як число. Для кожного масиву викликається шаблонна функція.

#include<iostream>

#include<conio.h>

using namespace std;

template <class atype>

int find(atype* array,atype value,int size)

{for(int j=0;j<size;j++)

if(array[j]==value)

return j;

return -1;

}

//

char chrArr[]={1,3,5,9,11,13};

char ch=5;

int intArr[]={1,3,5,9,11,13};

int in=6;

long lonArr[]={1L,3L,5L,9L,11L,13L};

long lo=11L;

double dubArr[]={1.0,3.0,5.0,9.0,11.0,13.0};

double db=4.0;

int main()

{

cout<<"\n 5 v chrArray index="<<find(chrArr,ch,6);

cout<<"\n 6 v intArray index="<<find(intArr,in,6);

cout<<"\n 11 v lonArray index="<<find(lonArr,lo,6);

cout<<"\n 4 v dubArray index="<<find(dubArr,db,6);

cout<<endl;

getch();

   return 0;

}

Програма 14.2

 

 

Шаблонний аргумент ми називаємо іменем atype. Воно з’являэться в аргументах двычы: як тип вказывника на масив ы як тип шуканого значення.

При виклику шаблонної функції всі екземпляри даного аргументу шаблону повинні бути однакового типу. Не можна в масиві цілого типу шукати дійсне значення:

int intarray[]={1,3,5,7};

float f1=5.0;

int value=find(intarray,f1,4);

Компілятору потрібно, щоб всі екземпляри atype були одного типу. Він може згенерувати коду функції

find(int*,int,int);

але не

find(int*,float,int);

 

 

Різні аргументи одного шаблону

В шаблоні функції можна використати кілька шаблонних аргументів. У попередньому прикладі можна зробити розмір масиву ще одним елементом шаблону. Назвемо його btype.

template <class atype>

btype find(atype* array,atype value,btype size)

{for(btype j=0;j<size;j++)

if(array[j]==value)

return j;

return static_cast<-1>(-1);

}

 

Тепер можна використовувати значення як типу int, так і long і навіть типу користувача в якості розміру масиву. Компілятор при своїй роботі буде орієнтуватися не тільки на різні типи самого масиву і шуканого числа, але й на різні типи значень його розміру.

 

 

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

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

Раніше ми створили клас stack для зберігання даних типу int. Бажано було б скласти аналогічний клас для зберігання даних типу long. Але ще краще було б скласти шаблон, який давав би нам змогу зберігати дані потрібного типпу «на вибір». Використаємо з цією метою концепцію шаблонів.

//реалізація стеку у вигляді шаблону

#include<iostream>

#include<conio.h>

using namespace std;

const int MAX=100;

template<class Type>

class Stack

{private:

Type st[MAX];

int top;

public:

Stack()

{top=-1;}

 

void push(Type var)

{st[++top]=var;

}

 

Type pop()

{return st[top--];}

};

/////////////

 

 

int main()

{ Stack<float> s1;

s1.push(1111.1F);

s1.push(2222.2F);

s1.push(3333.3F);

cout<<"1: "<<s1.pop()<<endl;

cout<<"2: "<<s1.pop()<<endl;

cout<<"3: "<<s1.pop()<<endl;

///////

Stack<long> s2;

s2.push(123123123L);

s2.push(234234234L);

s2.push(345345345L);

cout<<"1: "<<s2.pop()<<endl;

cout<<"2: "<<s2.pop()<<endl;

cout<<"3: "<<s2.pop()<<endl;

getch();

   return 0;

}

Програма 14.3

Шаблонний аргумент Type використовується замість фіксованого типу у всіх місцях специфікації класу, де є посилання на тип масиву st.

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

Stack<float> s1;

Такий вираз створює об’єкт s1. Це стек, в якому зберігаються числа типу float. У всіх його методах використовується тип float.

Створення об’єкту типу Stack, що зберігає об’єкти інших типів, як у виразі

Stack<long> s1;

означає не тільки резервування іншого об’єму пам’яті для даних, але й створення нового набору методів, що оперують типом long.

 

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 61; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.23.101.60 (0.005 с.)