Простейший шаблон функции имеет форму:
template <class Type> <заголовок>
{
<тело функции>
}

В общем случае шаблон функции может содержать несколько параметров, каждый из которых может быть не только типом, но и просто переменной.
Пример 1
template <class A, class B, int i> void f() {...}

Шаблон функции использует в качестве аргумента тип переменной.
Пример 2
template<class T>  Tsgr_it(T x)
{
...
return x*x;
}
В шаблоне может использоваться необязательный первый тип как параметр
Пример 3
template<class T1, class T2>
max(T1 x, T2 y)
{ return (x>y) ? x : y; }

В C++ вызов шаблона функции, использующий конкретный тип данных, приводит к тому, что компилятор создает код соответствующей версии функции. Этот процесс называется инстанцированием. Конкретный тип для инстанцирования определяется компилятором автоматически, исходя из типов параметров при вызове функции, либо задается явным образом. При повторном вызове с тем же типом данных код заново не генерируется. Если на месте параметра шаблона находится не тип, а переменная, то должно указываться константное выражение.
Пример 4
Явное задание аргументов при вызове:
template<class x, class y, class z>void (x, y, z);
void g()
{
f < int, char*
}
Как и обычные функции, шаблоны функций могут быть перегружены как с помощью шаблона, так и с помощью обычной функции. В программе можно предусмотреть специальную обработку.