Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Шаблони функцій з кількома аргументами
Розглянемо інший приклад шаблону функції. В ньому три аргументи, два з яких шаблонні, а один – базового типу. Функція призначена для пошуку в масиві заданого числа. Вона повертає індекс знайденого значення або -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; просмотров: 65; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.101.106 (0.007 с.) |