Функції, перевантажені функції, шаблони

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

Розглянемо приклад: нам потрібно написати функцію яка шукає дані в масиві та  повератає індекс масиву де містяться ці дані, якщо дані відсутні функція повертає  -1.

Ця функція приймає вказівник на масив

де містяться цілі числа, значення яке потрібно знайти

та розмір масиву

Така функція виконуватиме пошук чисел в масиві типу даних int. Для того щоб робити пошук в масивах інших типів даних існує кілька способів:

1.Використання  функцій

Реалізація окремих функцій з різними іменами для різних типів даних. Цей спосіб працює в С та C++. Недоліком є збільшення тексту програми якщо таких функцій потрібно багато.

компілюємо програму : gcc  -std=C99 -o find.c find
запускаємо на виконання: ./find
отримуємо результат:

2.Перевантаження функцій

Цей спосіб подібний до попереднього, однак ми можемо використовувати те саме ім’я для всіх функцій, але із різними параметрами.Функція Find() називається перевантаженою. Ми передаєпо в фунцію значення одного із типів даних, а компілятор сам визначає яку функцію для цих даних потрібно викликати. Цей спосіб працює тільки на С++.

Компіляція програми: g++ find2.c -o find2
запуск програми на виконання: ./find2
результат роботи:

3.Шаблони(Templates) функцій

Цей спосіб найбільш універсальний за попередні два. Також працює тільки на С++. Шаблони функцій дозволяють використовувати ті ж самі функції для різних типів даних, роблять програму компактнішою, за рахунок універсальності функцій. Для використання шаблонів використовується наступний синтаксис

aType та bType – імена типів даних, можуть мати довільні імена. Під час компіляції ці типи даних заміняються на конкретні типи даних (int, float, char, long..). Тобто якщо нам потрібно працювати з масивом int компілятор автоматично вибере функцію для роботи з масивом int. Наприклад відбудуться наступні зміни для типів:

int:

float:

char:

для приведення результату до типу bType використовується static_cast <bTrype> 

Компіляція програми: g++ find3.c -o find3
запуск програми на виконання: ./find3
результат роботи:

Як видно із прикладів, кожний спосіб дає одинаковий результат.