Узагальнена функція
В першу чергу варто домовитися який сенс ми вкладаємо у слово Звісно ж їх пряме значення: яким можуть користуватися Очевидні приклади це громадський транспорт, лавочки в парках чи ваш домашній диван на якому може сидіти член родини.
Мова С++ є суворо типізованою. Тому, ми зобов’язанні вказувати тип інформації яку будемо використовувати чи отримувати. Вам варто пригадати поняття функції, перевантаження функцій.
В даних уроках ви вчилися створювати функції, надавати їм аргументів, а також, створювати функцію з одним для різних типів і кількості аргументів.
Великим недоліком даного методу (перевантаження функцій) є те, що ми буквально буваємо змушені створювати однакові функції для аргументів різних типів. Ці функції виконують абсолютно ті ж самі дії, але для інформації різного типу.
Для того, щоб не створювати функції для кожного випадку і використовують «узагальнені» функції. Очевидно, що таку функцію можна використати для різної інформації.
Створення узагальненої функції відбувається за допомогою:
1. Ключового слова
2. Далі, у трикутних дужках ми маємо створити змінну (або змінні якщо очікуємо декілька різних типів яка символізуватиме тип даних. Це відбувається доволі просто. Вказуємо ключове слово та яке використовуватимемо для типу даних. Наприклад:
3. Вказуємо тип значення яке повертатиме функція.
4. Вказуємо функції.
5. В круглих дужках вказуємо необхідні аргументи функції (якщо вони є звісно При цьому, якщо є змінна тип якої може змінюватися залежно від передаваної інформації, то її тип вказуємо ім’ям класу створеного в (в нашому прикладі це Наприклад:
template <class Ім'я_загального_типу> тип_функції ім'я_функції(аргументи_функції)
При цьому виклик узагальненої функції відбувається так же як і виклик звичайної функції.
Для прикладу створимо узагальнену функцію, яка буде виводити елементи масиву:
#include <iostream>
//class X - символізує змінний тип. Де "Х" буде типом отриманої інформації
template <class X> void displayMas(X* mas, int lenght)
{
for (int i = 0; i < lenght; i++)
std::cout << mas[i] << " ";
std::cout << std::endl << std::endl;
}
int main()
{
const int size = 4;
int imas[size] = { 5, 7, 2, 3 };
float fmas[size] = { 9.8, 7.6, 5.43, 2.1 };
char cmas[size] = { 'a', 's', '+', '2' };
//imas є типом "int", тому "Х" стане типом "int"
displayMas(imas, size);
//fmas є типом "float", тому "Х" стане типом "float"
displayMas(fmas, size);
//cmas є типом "char", тому "Х" стане типом "char"
displayMas(cmas, size);
}
Звісно ж ви зможете створити декілька змінних з типом Вони можуть бути як аргументами функції, так і змінними створеними в середині функції.
#include <iostream>
template <class X> void Sum(X value1, X value2)
{
X sum;
sum = value1 + value2;
std::cout << "sum = " << sum << std::endl;
}
int main()
{
int e = 5, f = 21;
Sum(e, f);
}
Важлива деталь! Якщо ви створите декілька змінних загального типу. Наприклад:
template <class X> void displayMas(X mas1, X mas2, int lenght)
То, вони будуть вважатися одним типом! І він береться по першій переданій інформації. Тобто, якщо в нашому прикладі буде типу а типу то програма видасть помилку. Бо очікуватиме в якості теж тип
Тому, будьте обережні. Програма визначає тип при запуску даної функції та працює саме з тим типом.
Якщо ж ви плануєте передавати два чи більше змінних типів, то вам потрібно створити відповідну кількість загальних класів. При цьому їх кількість буде орієнтуватися за кількістю типів, а не змінних! Створення відбувається через кому.
template <class X, class Y>
Наприклад:
#include <iostream>
template <class X, class Y> void disTwoType(X value1, Y value2) {
std::cout << "value 1: " << value1 << std::endl;
std::cout << "value 2: " << value2 << std::endl;
}
int main()
{
double a = 4.3;
char b = '!';
disTwoType(a, b);
}