Розглянемо інший приклад шаблону функції. В ньому три аргументи, два з яких шаблонні, а один – базового типу. Функція призначена для пошуку в масиві заданого числа. Вона повертає індекс знайденого значення або -1 у випадку відсутності в масиві. Аргументами є вказівник на масив; значення, яке треба знайти, а також розмір масиву. В main() ми визначаємо 4 різних масиви різних типів і 4 значення, які потрібно знайти. Тип char в даному прикладі сприймається як число. Для кожного масиву викликається шаблонна функція.
#include<iostream>
#include<conio.h>
using namespace std;
template <class atype>
int find(atype* array,atype value,int size)
{for(int j=0;j<size;j++)
if(array[j]==value)
return j;
return -1;
}
//
char chrArr[]={1,3,5,9,11,13};
char ch=5;
int intArr[]={1,3,5,9,11,13};
int in=6;
long lonArr[]={1L,3L,5L,9L,11L,13L};
long lo=11L;
double dubArr[]={1.0,3.0,5.0,9.0,11.0,13.0};
double db=4.0;
int main()
{
cout<<"\n 5 v chrArray index="<<find(chrArr,ch,6);
cout<<"\n 6 v intArray index="<<find(intArr,in,6);
cout<<"\n 11 v lonArray index="<<find(lonArr,lo,6);
cout<<"\n 4 v dubArray index="<<find(dubArr,db,6);
cout<<endl;
getch();
return 0;
}
Програма 14.2
Шаблонний аргумент ми називаємо іменем atype. Воно з’являэться в аргументах двычы: як тип вказывника на масив ы як тип шуканого значення.
При виклику шаблонної функції всі екземпляри даного аргументу шаблону повинні бути однакового типу. Не можна в масиві цілого типу шукати дійсне значення:
int intarray[]={1,3,5,7};
float f1=5.0;
int value=find(intarray,f1,4);
Компілятору потрібно, щоб всі екземпляри atype були одного типу. Він може згенерувати коду функції
find(int*,int,int);
але не
find(int*,float,int);
Різні аргументи одного шаблону
В шаблоні функції можна використати кілька шаблонних аргументів. У попередньому прикладі можна зробити розмір масиву ще одним елементом шаблону. Назвемо його btype.
template <class atype>
btype find(atype* array,atype value,btype size)
{for(btype j=0;j<size;j++)
if(array[j]==value)
return j;
return static_cast<-1>(-1);
}
Тепер можна використовувати значення як типу int, так і long і навіть типу користувача в якості розміру масиву. Компілятор при своїй роботі буде орієнтуватися не тільки на різні типи самого масиву і шуканого числа, але й на різні типи значень його розміру.