Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора II Sem.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
679.94 Кб
Скачать

7.1.2. Безпосередньо задане перевизначення узагальненої функції

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

"Вручну" перевизначена версія узагальненої функції називається епон середньою спеціалізацією.

Демонстрація механізму перевизначення шаблонної функції

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

template <class aType> void swapAB(aType &a, aType &b)

{

aType tmp; // Створення тимчасової змінної

tmp = a;

a = b;

b = tmp;

cout << "Виконується шаблонна функція swapAB" << endl;

}

// Ця функція перевизначає узагальнену версію функції swapAB() для int-параметрів. void swapAB(int &a, int &b)

{

int tmp;

tmp = a;

a = b;

b = tmp;

cout << "Це int-спеціалізація функції swapAB" << endl;

}

int main()

{

int i = 10, j = 20;

double x = 10.1, y = 23.3;

char a = 'x', b = 'z';

cout << "Початкові значення i, j: " << i << " " << j << endl;

cout << "Початкові значення x, y: " << x << " " << y << endl;

cout << "Початкові значення a, b: " << a << " " << b << endl;

swapAB(i, j); // Викликається безпосередньо перевизначена функція swapAB().

swapAB(x, y); // Викликається узагальнена функція swapAB().

swapAB(a, b); // Викликається узагальнена функція swapAB().

cout << "Після перестановки i, j: " << i << " " << j << endl;

cout << "Після перестановки x, y: " << x << " " << y << endl;

cout << "Після перестановки a, b: " << a << " " << b << endl;

getch(); return 0;

}

Внаслідок виконання ця програма відображає на екрані такі результати:

Початкові значення i, j: 10 20

Початкові значення x, у: 10.1 23.3

Початкові значення a, b: x z

Це int-спеціалізація функції swapAB.

Виконується шаблонна функція swapAB.

Виконується шаблонна функція swapAB.

Після перестановки i, j: 20 10

Після перестановки x, у: 23.3 10.1

Після перестановки a, b: z x

Як зазначено в коментарях до цієї програми, під час виклику функції swapAB(i,j) виконується безпосередньо перевизначена версія функції swapAB(), яку визначено у програмі. Компілятор у цьому випадку не генерує узагальнену функцію swapAB(), оскільки вона перевизначається безпосередньо заданим варіантом перевизначеної функції. Для позначення безпосередньої спеціалізації функції можна використовувати новий альтернативний синтаксис, що містить ключове слово template. Наприклад, якщо задати спеціалізацію з використанням цього альтернативного синтаксису, то перевизначена версія функції swapAB() з попереднього коду програми виглядатиме так:

// Використання нового синтаксису задавання спеціалізації

template<> void swapAB<int>(int &a, int &b)

{

int tmp;

tmp = a;

a = b;

b = tmp;

cout << "Це int-спеціалізація функції swapAB" << endl;

}

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

Безпосередня спеціалізація шаблону дає змогу спроектувати версію узагальненої функції з розрахунку на деяку унікальну ситуацію, щоб, можливо, скористатися перевагами підвищеної швидкодії програми тільки для одного типу даних. Але, як правило, якщо виникає потреба мати різні версії функції для різних типів даних, то доцільно використовувати перевизначені функції, а не шаблони.