Константи й типи як параметри шаблона

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

const size_t defStackSize=512;

template<class T>

Class Stack

слід написати:

template<class T,size_t defStackSize>

Class Stack1

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

Використання шаблонних класів

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

a кожний аргумент, який має вигляд 'class iдентифiкатор' (параметр типу), замінюється іменем дійсного типу;

a кожний аргумент, що має вигляд 'iм'я_типу iдентифiкатор' (нетиповий параметр), замінюється константним виразом. Наприклад:

Stack<int>stackekz;

//утворюється екземпляр шаблонного класу stackekz з типом

//int як параметр

Stack<int>stackekz1(40);

//утворюється екземпляр шаблонного класу stackekz1 з //типом int як параметр і викликається конструк

//тор класу з параметром 40

Stack<long>*pstackekz[10];

//оголошується масив з 10 елементів-покажчиків на тип //Stack із типом long як параметр

Створивши представника шаблона класу, можна працювати з ним так само, як з екземпляром звичайного класу. Наприклад:

Int main(void)

{Stack<int>Stack0fInt(10);

Stack0fInt.push(33);

Stack0fInt.push(44);

Stack0fInt.push(55);

cout<<"помiщенi значення рiвнi:"

<<Stack0fInt.pop()<<','

<<Stack0fInt.pop()<<','

<<Stack0fInt.pop()<<end1;

Stack<double>StackofDouble(10);

Stack0fDouble.push(2.3456);

Stack0fDouble.push(4.8967);

Stack0fDouble.push(-1.345);

cout<<"помiщенi значення рiвнi:"

<<Stack0fDouble.pop()<<','

<<Stack0fDouble.pop()<<','

<<Stack0fDouble.pop()<<end1;

return 0;}

До шаблонного класу можна застосувати ключове слово typedef, щоб спростити його використання. Наприклад,

Stack<long>lstsk;

Stack<long>*plstck;

Stack<long>alstck[10];

можна спростити до

typedef Stack<long>LStack;

LStack lstck;

LStack*plstck;

LStack alstck[10];


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



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