Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 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; просмотров: 124; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.198 (0.007 с.) |