Шаблоны функций

Шаблоны классов определяют семейство связанных классов, основанных на типе аргументов, переданных классу при создании его экземпляра. Шаблоны функций похожи на шаблоны классов, но определяют семейство функций. С помощью шаблонов функций можно задавать наборы функций, основанных на одном коде, но действующих в разных типах или классах. Следующий шаблон функции меняет местами два элемента.

// function_templates1.cpp
template< class T > void MySwap( T& a, T& b ) {
   T c(a);
   a = b;
   b = c;
}
int main() {
}

Этот код определяет семейство функций, которые меняют местами значения аргументов. В этом шаблоне можно создать функции, которые будут переключать int и long типы, а также определяемые пользователем типы. Функция MySwap даже меняет местами классы, если правильно определены конструктор копии и оператор присваивания.

Кроме того, шаблон функции не позволит переключить объекты разных типов, так как компилятор знает типы параметров a и b во время компиляции.

Хотя эта функция может выполняться нешаблонной функцией с использованием указателей void, версия шаблона типобезопасна. Рассмотрим следующие вызовы:

int j = 10;
int k = 18;
CString Hello = "Hello, Windows!";
MySwap( j, k );          //OK
MySwap( j, Hello );      //error

Второй вызов MySwap приводит к ошибке времени компиляции, поскольку компилятору не удается создать функцию MySwap с параметрами разных типов. Если бы использовались указатели void, оба вызова функции скомпилировались бы правильно, но функция не работала бы должным образом во время выполнения.

Для шаблона функции можно явно задавать аргументы. Например:

// function_templates2.cpp
template<class T> void f(T) {}
int main(int j) {
   f<char>(j);   // Generate the specialization f(char).
   // If not explicitly specified, f(int) would be deduced.
}

Если аргумент шаблона задан явно, выполняются обычные неявные преобразования для преобразования аргумента функции в тип соответствующих параметров шаблона функции. В приведенном выше примере компилятор преобразуется j в тип char.

См. также

Шаблоны
Создание экземпляра шаблона функции
Явное создание экземпляра
Явная специализация шаблонов функций