
- •7. Робота з шаблонними, функціями та класами
- •7.1. Поняття про узагальнені функції
- •7.1.1. Механізм реалізації шаблонної функції з одним узагальненим типом
- •7.1.2. Безпосередньо задане перевизначення узагальненої функції
- •7.1.3. Шаблонна функція з двома узагальненими типами
- •7.1.4. Механізм перевизначення специфікації шаблону функції
- •7.1.5. Використання стандартних параметрів у шаблонних функціях
- •7.1.6. Обмеження, які застосовуються при використанні узагальнених функцій
- •7.1.7. Приклад створення узагальненої функції abs()
- •7.2. Поняття про узагальнені класи
- •7.2.1. Створення класу з одним узагальненим типом даних
- •7.2.2. Створення класу з двома узагальненими типами даних
- •7.2.3. Приклад створення узагальненого класу для організації безпечного масиву
- •7.2.4. Використання в узагальнених класах аргументів, що не є узагальненими типами
- •11.2.1. Передача покажчиком на функцію її адреси іншій функції
- •9.2.3. Класи потоків
- •9.3. Особливості механізмів перевизначення операторів введення-виведення даних
- •9.3.1. Створення перевизначених операторів виведення даних
- •9.5. Організація файлового введення-виведення даних
- •9.5.1. Відкриття та закриття файлу
- •9.5.2. Зчитування та запис текстових файлів
- •9.5.3. Неформатне введення-виведення даних у двійковому режимі
- •9.5.4. Зчитування та записування у файл блоків даних
- •10. Динамічна ідентифікація типів і оператори приведення типу
- •10.1. Динамічна ідентифікація типів
- •10.1.1. Отримання типу об'єкта у процесі виконання програми
- •10.1.2. Приклад rtti-застосування
- •11. Поняття про простори імен та інші ефективні програмні засоби
- •11.1. Особливості організації простору імен
- •11.1.1. Поняття про простори імен
- •11.1.2. Застосування настанови using
- •11.1.3. Неіменовані простори імен
- •11.1.4. Застосування простору імен std
- •11.2. Застосування покажчиків на функції
- •11.2.2. Пошук адреси перевизначеної функції
- •11.3. Поняття про статичні члени-даних класу
- •11.5. Застосування до функцій-членів класу модифікаторів const і mutable
- •11.6. Використання explicit-конструкторів
- •12. Введення в стандартну бібліотеку шаблонів
- •12.1. Огляд стандартної бібліотеки шаблонів
- •12.2. Поняття про контейнерні класи
- •12.3. Механізми роботи з векторами
- •12.3.1. Доступ до елементів вектора за допомогою ітератора
- •12.3.2. Вставлення та видалення елементів з вектора
- •12.3.3. Збереження у векторі об'єктів класу
- •12.3.4. Доцільність використання ітераторів
- •7. Робота з шаблонними, функціями та класами 1
- •7.1. Поняття про узагальнені функції 1
- •10. Динамічна ідентифікація типів і оператори приведення типу 26
- •11. Поняття про простори імен та інші ефективні програмні засоби 31
- •12. Введення в стандартну бібліотеку шаблонів 44
7.1.3. Шаблонна функція з двома узагальненими типами
У template-настанові можна визначити декілька узагальнених типів даних, використовуючи перелік елементів, розділених між собою комами. Наприклад, у наведеному нижче коді програми створюється шаблонна функція з двома узагальненими типами.
Демонстрація механізму застосування шаблонної функції з двома узагальненими типами
#include <vcl>
#include <iostream> // Для потокового введення-виведення
#include <conio> // Для консольного режиму роботи
using namespace std; // Використання стандартного простору імен
template <class aType, class bType> void FunC(aType a, bType b)
{
cout << a << " " << b << endl;
}
int main()
{
FunC(10, "Привіт");
FunC(0.23, 10L);
getch(); return 0;
}
У наведеному прикладі у процесі виконання функції main(), коли компілятор генерує конкретні примірники функції FunC(), заповнювачі типів aType і bType замі- нюються спочатку парою типів даних int і char *, а потім парою double і long відповідно.
Необхідно пам'ятати! Створюючи шаблонну функцію, програміст дає змогу компіляторові генерувати стільки її різних версій, скільки необхідно необхідно для оброблення різних типів даних, які використовує програма для її виклику.
7.1.4. Механізм перевизначення специфікації шаблону функції
Окрім створення безпосередньо перевизначених версій узагальненої функції, можна також перевизначати саму специфікацію шаблону функції. Для цього достатньо створити ще одну версію шаблону, яка відрізнятиметься від інших переліком параметрів. Розглянемо такий приклад.
Демонстрація механізму перевизначення специфікації шаблону функції
#include <vcl>
#include <iostream> // Для потокового введення-виведення
#include <conio> // Для консольного режиму роботи
using namespace std; // Використання стандартного простору імен
// Перша версія шаблону Fun().
template <class aType> void Fun(aType a)
{
cout << "Виконується функція Fun(aType a)" << endl;
}
// Друга версія шаблону Fun().
template <class aType, class bType> void Fun(aType a, bType b)
{
cout << "Виконується функція Fun(aType a, bType b)" << endl;
}
int main()
{
Fun(10); // Викликається функція Fun(a).
Fun(10, 20); // Викликається функція Fun(a, b).
getch(); return 0;
}
У цьому коді програми шаблон для функції Fun() перевизначається, щоб забезпечити можливість прийняття як одного, так і двох параметрів.
7.1.5. Використання стандартних параметрів у шаблонних функціях
У шаблонних функціях можна змішувати стандартні параметри з узагальненими параметрами типу. Ці параметри працюють так само, як і у будь-якій іншій функції. Розглянемо такий приклад.
Демонстрація механізму використання стандартних параметрів у шаблонній функції
#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 << endl;
times--;
} while(times);
cout << endl;
}
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 – стандартний, він передається за значенням. Змішане задавання узагальнених і стандартних параметрів, як правило, не викликає жодних проблем їх реалізації, застосовується найчастіше у програмуванні.