Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

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

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

Приклад:

const int defSize = 100;

template <class T>

class TArray

{

public:

Tarray( int size = defSize )

{

// ...

}

~TArray()

{

// ...

}

void add( T item );

protected:

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

}

void TArray<char*>::add( char *str );

{

// ...

}

template <class T>

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

{

// ...

}

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

#include ”array.h”

int main(void)

{ int i1=10;

Tarray<int> iArray;

iArray.add(i1);

char *msg=“Look at the rose hill !”

Tarray<char *> strArray;

strArray.add(msg);

return 0;

}

Можна також передбачити повне перевизначення шаблона класу, що служить для роботи з деяким особливим типом. При спецiалiзацiї цiлого шаблонного класу треба зробити слiдуюче:

-Передбачити визначення спецiалiзованого шаблонного класу, помiстивши його пiсля визначення узагальненого класу.

-Передбачити визначення для всiх елементiв-функцiй.

Приклад:

#include<cstring.h>

#include “array.h”

class TArray<string>

{

public:

TArray( int size = defSize )

{

// ...

}

~TArray()

{

// ...

}

void add( string str, int indx = -1 );

};

void TArray<string>::add( string str, int indx )

{

// ...

}

int main( void )

{

int i1 = 10;

TArray<int> iList;

iList.add( i1 );

string str( "Morning at Rose Hill!" );

TArray<string> sList;

sList.add( str );

return 0;

}

Реалiзацiя шаблонiв С++ не дозволяє перегружати iм'я шаблона класу. Наприклад, не можна визначити одночасно TArray<class T> i TArray<class T, int size>.

11.3 Шаблони та конфiгурацiя компiлятора.

В С++ існує три специфiчнi опцiї компiлятора , якi визначають, яким

чином буде генеруватися код для представникiв шаблонiв функцiй i класiв:

-Jd(smart),

-Jgd(global),

-Jgx(external).

11.3.1 Шаблони Smart.

Опцiя шаблонiв Smart приймається по замовчуванню. Вона вказує компiлятору про необхідність генерувати вiдповiдний код для тих типiв, для яких створюються представники шаблона (відмітимо, що представники можуть і не створюватись). Ця конфiгурацiя пiдходить для проектiв, в яких представники шаблона створюються тiльки пiсля того, як компiлятору стане вiдомо повне визначення шаблона (визначення тiла шаблона функцiї, тiла елементiв-функцiй i визначення статичних елементiв даних).

Хоч компiлятор може декiлька раз генерувати код для однієї і тієї ж комбiнацiї шаблон/тип, якщо вона використовується в рiзних модулях, в кiнцевий модуль (.EXE чи .DLL) компоновщик включить тiльки один такий екземпляр коду.