Функция-шаблон определяет общий набор операций, который будет применен к данным различных типов.
Например, алгоритм быстрой сортировки совершенно одинаковый и для массива целых чисел, и для массива чисел с плавающей запятой. Отличается только тип данных, подлежащих сортировке.
При помощи создания функции-шаблона можно определить сущность алгоритма безотносительно к типу данных. После этого компилятор автоматически генерирует корректный код для того типа данных, для которого создается данная реализация, т. е. когда создается функция-шаблон, создается функция, которая может автоматически перегружать сама себя.
Функции-шаблоны создаются с использованием ключевого слова template (шаблон).
Где параметр-тип – это "держатель места" для имени типа данных, которое используется функцией. Параметр-тип может быть использован в определении функции. Но этот "держатель места" будет автоматически заменен компилятором на фактический тип данных во время создания конкретной версии функции.
Например, создадим функцию-шаблон, которая имеет два параметра и меняет между собой величины значений этих параметров.
# include <iostream.h>
// Х – шаблон типа, используемый в качестве параметра-типа. Далее объявляется функция
//swap(), использующая тип данных Х для параметров, которые будут обмениваться значениями
template <class Х> void swap (X &a, Х &b)
{
X temp;
temp=a;
a=b;
b=temp;
}
int main()
{
int i=10, j=20;
float x=10.1, y=23.3;
char a='x', b='z';
cout<<"Первоначальные значения i, j: "<<i<<" "<<j<<endl;
cout<<" Первоначальные значения x, y: "<<x<<" "<<y<<endl;
cout<<" Первоначальные значения a, b: "<<a<<" "<<b<<endl;
swap(i, j);
swap(x, y);
swap(a, b);
cout<<"Измененные значения i, j: "<<i<<" "<<j<<endl;
cout<<" Измененные значения x, y: "<<x<<" "<<y<<endl;
cout<<" Измененные значения a, b: "<<a<<" "<<b<<endl;
return 0;
}
Функция swap() одинаково успешно будет работать для различных типов данных: целых чисел, чисел с плавающей точкой и символов.
Можно определить несколько типов-шаблонов данных в инструкции template, перечислив их через запятую.
Например, рассмотрим программу, реализующую переопределение функции max для аргументов различных типов, с использованием функции-шаблона:
#include<iostream.h>
#include<conio.h>
template <class Type1, class Type2> Type1 max(Type1 x, Type2 y)
{
return (x>y)?x:y;
}
// по шаблону типы аргументов должны быть одинаковыми,
// поэтому, для вариантов max(int, char) и max(char, int)
// нужно явно описать необходимые преобразования типов