Шаблони функцій
За допомогою шаблона функції можна визначити алгоритм, що буде застосовуватися до даних різних типів, а конкретний тип даних передається функції у вигляді параметра на етапі компіляції. Компілятор автоматично генерує правильний код, що відповідає переданому типу. Таким чином, створюється функція, що автоматично перевантажує сама себе й при цьому не містить накладних витрат, пов'язаних з параметризацією.
Формат найпростішої функції-шаблона:
template <class Type>
заголовок
{/* тіло функції */ }
або
template <typename Type>
заголовок
{/* тіло функції */ }
Замість слова Туре може використовуватися довільне ім'я.
У загальному випадку шаблон функції може містити кілька параметрів, кожний з яких може бути не тільки типом, але й просто змінної, наприклад:
template <class A, class В, int i>
void f()
{ ... }.
Як і звичайні функції, шаблони функцій можуть бути перевантажені як за допомогою шаблонів, так і звичайними функціями.
Можна передбачити спеціальну обробку окремих параметрів і типів за допомогою спеціалізації шаблона функції.
Як приклад приведемо шаблон функції, що міняє елементи місцями.
template <class T>
void MySwap(T&a,T&b)
{
T c=a;
a=b;
b=c;
}
Основні властивості параметрів шаблона наступні.
1. Імена параметрів шаблона повинні бути унікальними у всьому визначенні шаблона.
2. Список параметрів шаблона функцій не може бути порожнім.
3. У списку параметрів шаблона функцій може бути кілька параметрів. Кожний з них повинен починатися зі службового слова class.
4. Неприпустимо використовувати в заголовку шаблона параметри з однаковими іменами.
5. Ім'я параметра шаблона має в обумовленої шаблоном функції усі права ім'я типу. Ім'я параметра шаблона видно у всьому визначенні й приховує інші використання того ж ідентифікатора в області, зовнішньої стосовно даного шаблона.
6. Всі параметри шаблона повинні бути обов'язково використані в специфікаціях формальних параметрів визначення функції.