Слайд 2
Шаблон класу – схема побудови інших класів на
основі цього шаблону.
Шаблони дають змогу створити один опис класу,
який можна використовувати для роботи з різними типами даних(vector, list…).
Шаблони значно скорочують код програми, тому що достатньо написати один шаблонний клас, який зможе працювати з різними типами даних.
Слайд 3
Синтаксис оголошення шаблонного класу
Оголошення шаблону починається зі слова
template, яке вказує компілятору на те, що далі йде
оголошення шаблону.
Після template в < > вказуються шаблонні параметри
В даному випадку ключове слово class не означає те, що T1 обов’язково має бути класом, T1 може бути простим типом даних (int, char…)
Також замість слова клас можна використовувати слово typename
Template class A {…}
Після цього у описі класу можна використовувати T1, T2 так само як і звичайні типи даних.
Слайд 4
Приклад шаблонного стеку
tempalte
class Stack {
private:
enum {MAX = 10}
Type items[MAX];
int top;
public:
Stack();
bool IsEmpty();
bool IsFull();
bool Push(const Type& item); //передаємо дані типу T для занесення в стек
bool Pop(Type& item);
};
….
//використання шаблонного класу
Stack stack_int;
Stack stack_string;
Слайд 5
Реалізація методів шаблонного класу
Методи шаблонного класу стають шаблонними
методами.
Можуть бути як вбудованими (inline) так і реалізовані
за межами класу.
Синтаксис реалізації шаблонного методу:
Template classNmae::methodName(parameters).
Якщо метод реалізовується в класі, то синтаксис реалізації є таким самим як у методів звичайного класу.
Слайд 6
Приклад реалізації
template
Stack::IsEmpty() {
return top
== 0;
}
template
bool Stack::IsFull() {
return top
== MAX;
}
template
bool Stack::push(const Type& item) {
if (top < MAX) {
items[top++] = item;
return true;
}
else {
return false;
}
}
template
bool Stack::pop(Type& item) {
if (top > 0) {
item = items[--top];
return true;
}
else {
return false;
}
}
Слайд 7
Параметри за замовчуванням в шаблонах
Шаблонні класи можуть приймати
параметри за замовчуванням (функції з параметрами за замовчуванням).
Template
T1, class T2 = int> class A {…}
Якщо при створенні об’єкта класу А, другий параметр не буде вказаний, то компілятор буде підставляти замість T2 іnt.
A a1 //T1 = double, T2 = double
Aa2//T1 = double, T2 = int.
Слайд 8
Спеціалізація шаблонів
Явна спеціалізація – це визначення конкретного типу,
який має використовуватись замість загального шаблону.
Явна спеціалізація шаблону використовується
тоді, коли шаблонний клас має вести себе по-іншому для цього типу даних.
Синтаксис оголошення спеціалізованого шаблону:
Template<> class Ім’яКласу <Ім’я спеціалізованого типу>
Template class A {…} //загальний клас
Template<> class A {…} //спеціалізований клас.
Слайд 9
Часткова спеціалізація шаблонів – використовується тоді, коли у
шаблонному класі є декілька типів-параметрів(T1, T2) і клас має
працювати по-іншому, якщо один з параметрів є деяким типом.
Приклад
template class A {…} //загальний шаблон
template class A {…}//часткова спеціалізація
Якщо у компілятора є вибір, то він приймає найбльш спеціалізований шаблон. Тобто якщо ви створюєте об’єкт класу з параметрами то клас буде генеруватись на основі загального шаблону, але якщо у вас другим параметром буде int, то буде використовувавитсь частково спеціалізований шаблон.
Слайд 10
Рекурсивне використання шаблонів
Шаблон класу A, може виступати параметром
для того ж класу А.
Приклад:
template
class Array//шаблон масиву розміром n.
Array
a; // створення об’єкта типу Array. //Масив цілих чисел розміром 10.
Array, 10> b; //масив з 10 елементів, кожен з яких //є масивом з 5 елементів.
Слайд 11
Шаблони як члени класів
Шаблони можуть бути членами структури,
класу чи іншого шаблону. Ця властивість шаблонів часто використовується
в STL.
Приклад
template
class beta {
private:
template // область видимості класу hold – клас beta.
class hold {
private:
V val;
public:
hold(V v = 0) : val(v) {}
void show() const {cout << val << endl;}
V Value() const {return val;}
};
holdq; //об’єкти класу hold в класі beta.
hod n;
//...
}
Слайд 12
Шаблони як параметри
Шаблони можуть мати параметри, які також
є шаблонами. Це також використовується для реалізації бібліотеки STL.
Приклад
template
class Thing>
Class A {…}
Тут class Thing – параметр шаблону, при чому template class - тип, Thing – параметр.
Для створення об’єкту класу А, йому потрібно передати параметр, який відповідає типу class T> class .
Слайд 13
Шаблонні класи і друзі
Шаблонні класи можуть мати друзів
як і звичайні класи.
Друзі можуть бути шаблонними або простими
функціями, шаблонними або простими класами.
Дружні функції і класи можуть належати до одної з трьох груп:
Нешаблонні друзі
Зв’язні шаблонні друзі – тип друга визначається типом класу при створенні екземпляра.
Незв’язні шаблонні друзі – всі спеціалізації друга є друзями для всіх спеціалізацій шаблонного класу.
Слайд 14
Нешаблонні дружні функції
template
class HasFriend {
public:
// дружня фукнція для всіх екземплярів класу
HasFriend
friend void counts()
friend void report(HasFriend&); зв’язний друг
//....
//незв’язна дружня шаблонна функція, є дружньою для всіх екземплярів.
template friend void show(C &, D &)
}
HasFriend //функція counts() є дружньою для цього класу
HasFrined//і для цього теж
HasFrined //ф-я report(HasFriend&) дружня для цього класу
HasFriend//ф-я report(HasFriend&) дружня для цього класу
report(..) – не є шаблонною функцією, вона лише приймає шаблонний параметр.
Це означає, що потрібно створювати спеціалізації для параметра
void report(HasFriend&) {..}
void report(HasFrined&) {…}