logo search
ООП для Заоч / Пинчук Лозовская Программир на С

8.5. Функції з шаблонами

При оголошенні функції з шаблонами використовуються параметризовані типи - шаблони. Застосування такого засобу дає змогу писати більш універсальні коди. Це робить програми більш лаконічними і прийнятними. Водночас це є засіб повторного використання коду.

Наприклад, якщо нам потрібна функція, яка повертає значення меншого із двох параметрів, то є сенс побудувати її з використанням шаблонів:

template <class type> // type - ім’я абстрактного типу

type min(type A, type B)

{ return A<B? A:B;

}

Тепер цю функцію можна застосовувати з довільним типом параметрів:

min(10,15) // виклик функції int min(int,int);

min(8.5,4.3) // виклик функції min(double,double);

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

Шаблони типу мають глобальний статус, вони не можуть бути вкладені в клас або бути локальними в деякій функції.

Якщо використовується шаблон, що вказує тип значення, яке повертається, то він повинен збігатися із шаблоном одного з параметрів. Наприклад, наступна конструкція не буде надійно працювати:

template <class alfa, class beta)

alfa fun(beta x)

{ ...................

}

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

Спеціальна реалізація функції

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

// Приклад 1

template <class TYPE>

void swap(TYPE& a, TYPE& b) // функція обміну значеннями

{ TYPE R;

R=a; a=b; b=R;

}