Припустимо, що нам потрібно написати функцію обчислення модуля (абсолютного значення) числа. Ця функція буде використовуватися з одним певним числовим типом даних.
int abs(int n)
{return (n<0)?-n:n; }
Визначена нами функція бере аргумент типу int і повертає результат цього ж типу. Але тепер уявімо, що потрібно знайти модуль числа типу long. Доведеться писати ще одну функцію.
long abs(long n)
{return (n<0)?-n:n; }
І ще одну для типу float
float abs(float n)
{return (n<0)?-n:n; }
Як бачимо, тіло функції нічим не відрізняється. І все ж ці функції різні, оскільки обробляють аргументи і повертають значення різних типів. Вони можуть бути перезавантажені і мати однакові імена, але кожну з них треба визначати окремо. Багатократне переписування функцій-близнюків є трудомістким і знижує читабельність тексту та ускладнює внесення змін і поправок. Чи існує спосіб написати функцію один раз і змусити її працювати з різними типами даних? Так, існує, і цим способом є використання шаблонів.
Шаблон простої функції
Покажемо, як пишеться шаблон функції, що обчислює модуль числа. Шаблон працює з усіма базовими числовими типами. В програмі спершу визначається шаблонна версія abs(), а потім в main() проходить перевірка правильності її роботи.
//шаблон простої функції
#include<iostream>
#include<conio.h>
using namespace std;
template <class T>
T abs(T n)
{return(n>0)?n:-n;
}
int main()
{int int1=5;
int int2=-6;
long lon1=7000L;
long lon2=-8000L;
double dub1=9.95;
double dub2=-10.15;
cout<<"\nabs("<<int1<<")="<<abs(int1);
cout<<"\nabs("<<int2<<")="<<abs(int2);
cout<<"\nabs("<<lon1<<")="<<abs(lon1);
cout<<"\nabs("<<lon2<<")="<<abs(lon2);
cout<<"\nabs("<<dub1<<")="<<abs(dub1);
cout<<"\nabs("<<dub2<<")="<<abs(dub2);
cout<<endl;
getch();
return 0;
}
Програма 14.1
Тепер функція abs()може працювати зі всіма трьома типами даних: int, long, double. Вона працюватиме також з іншими числовими типами і з типами користувача, в яких перезавантажені оператор «менше» і унарний мінус.
Специфікація функції abs() для роботи з кількома типами даних.
template <class T>
T abs(T n)
{return(n>0)?n:-n;
}
Вся ця конструкція, починаючи від слова template, називається шаблоном функції.