Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

17.1.4. Перевантаження шаблону функції

Окрім створення безпосередньо перевантажених версій узагальненої функції, можна також перевантажувати саму специфікацію шаблону функції. Для цього достатньо створити ще одну версію шаблону, яка відрізнятиметься від інших переліком параметрів. Розглянемо такий приклад.

Код програми 17.3. Демонстрація способу оголошення перевантаженого шаблону функції

#include <vcl>

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

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

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

// Перша версія шаблону fun_f().

template <class aType> void fun_f(aType a_ob)

{

cout << "Виконується функція fun_f(aType a_ob)\n";

}

// Друга версія шаблону fun_f().

template <class aType, class bType> void fun_f(aType a_ob, bType b_ob)

{

cout << "Виконується функція fun_f(aType a_ob, bType b_ob)\n";

}

int main()

{

fun_f(10); // Викликається функція fun_f(a).

fun_f(10, 20); // Викликається функція fun_f(a, b).

getch(); return 0;

}

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

17.1.5. Використання стандартних параметрів у шаблонних функціях

У шаблонних функціях можна змішувати стандартні параметри з узагальненими параметрами типу. Ці параметри працюють так само, як і у будь-якій іншій функції. Розглянемо такий приклад.

Код програми 17.4. Демонстрація механізму використання стандартних параметрів у шаблонній функції

#include <vcl>

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

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

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

// Відображення даних задану кількість разів.

template<class aType> void repeat(aType data, int times)

{

int tim = times;

do {

cout << tim – times + 1 << " ==> " << data << "\n";

times--;

} while(times);

cout << "\n";

}

int main()

{

repeat("Це тест.", 3);

repeat(100, 5);

repeat(99.0/2, 4);

getch(); return 0;

}

Ось які результати генерує ця програма.

1 ==> Це тест.

2 ==> Це тест.

3 ==> Це тест.

1 ==> 100

2 ==> 100

3 ==> 100

4 ==> 100

5 ==> 100

1 ==> 49.5

2 ==> 49.5

3 ==> 49.5

4 ==> 49.5

У цій програмі функція repeat() відображає свій перший аргумент стільки раз, скільки задано її другим аргументом. Оскільки перший аргумент має узагальнений тип, то функцію repeat() можна використовувати для відображення даних будь-якого типу. Параметр times – стандартний, він передається за значенням. Змішане задавання узагальнених і неузагальнених параметрів, як правило, не викликає жодних проблем і застосовується найчастіше практикою програмування.

17.1.6. Обмеження, які застосовуються під час використання узагальнених функцій

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

void outdata(int i)

{

cout << i << "\n";

}

void outdata(double d)

{

cout << d * 3.1416 << "\n";

}