Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бичков - Основи сучасного програмування.doc
Скачиваний:
69
Добавлен:
07.03.2016
Размер:
2.67 Mб
Скачать

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

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

const size_t defStackSize=512;

template<class T>

class Stack

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

template<class T,size_t defStackSize>

class Stack1

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

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

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

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

 кожний аргумент, що має вигляд '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];

8.2.4. Спеціалізація шаблонів класу

Можна спеціалізувати шаблон класу, передбачивши для специфічних типів явну реалізацію деяких методів. Наприклад:

const int defSize=100;

template<class T>

class Array

{public:

Array(int size=defSize){

//...

}

~Array()

{

//...

}

Void add(t item);

protected:

//елементи даних

};

void Array<char*>::add(char*str)

{//...

cout<<"метод для типу char";

}

template<class T>

void Array<T>::add(T t)

{//...

cout<<"загальний метод";

}

У прикладі визначається спеціалізований варіант методу add для типу <char*>. Наступний приклад демонструє результат заміни цього методу:

Int main(void)

{int i1=10;

Array<int>iArray;