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

Определение единственного шаблона функции - удобная альтернатива определению набора перегруженных функций. В определении шаблона функции параметры типа описывают типы переменных, передаваемых при вызове функции в качестве аргументов. С помощью шаблонов функций языка C++ можно создать единственное общее определение функции, использующееся с различными типами данных.
Ранее в разделе о процедурном программировании указывалось, что для использования одной и той же функции с различными типами данных нужно определить отдельную перегруженную версию этой функции для каждого типа. Например, если требуется функция, возвращающая абсолютную величину значения как типа int, так и типа double, то нужно было написать две перегруженные функции:
int Abs(int N)
{
return N < 0 ? -N: N;
}
double Abs(double N)
{
return N < 0.0 ? –N: N;
}
Используя шаблон языка C++, можно создать единственное определение, автоматически обрабатывающее значения типа int, double или любого другого подходящего типа. Такой шаблон выглядит следующим образом:
template<class T> T Abs(T N)
{
return N < 0 ? –N: N;
}
В этом определении идентификатор T является параметром типа (type parameter). Он переопределяет тип переменной или константы, передаваемой при вызове функции. Если программа вызывает функцию Abs() и передает ей значение типа int, например:
cout << “Абсолютное значение -5 = ” << Abs(-5);
то компилятор автоматически сгенерирует версию функции, в которой идентифи¬катор типа T имеет тип int, и добавит в программу вызов этой версии функции. Автоматически сгенерированная функция будет эквивалентна функции, приведенной ранее:
int Abs(int N)
{
return N < 0 ? -N: N;
}
Аналогично, если программа вызывает функцию Abs() и передает ей значение типа double, например:
double D = -2.54;
cout << “Абсолютное значение D = ” << Abs(D) ;
то компилятор сгенерирует версию функции, в которой идентификатор типа T будет заменен на double, и добавит в программу вызов данной функции. Эта вновь сгенерированная версия функции эквивалентна следующей:
double Abs(double N)
{
return N < 0 ? –N: N;
}
Таким же образом компилятор генерирует дополнительные версии функции для каждого вызова, в котором указывается новый числовой тип данных, например short или float.
При определении шаблона нужно использовать спецификаторы template и class вместе с угловыми скобками, как показано в приведенном выше примере. Для параметра типа T можно использовать любой корректный идентификатор имени типа, а в угловые скобки можно включать несколько параметров типа.
Любом человеку хотелось бы купить недорогую квартиру для себя и своей семья, которая была бы очень удобной и красивой.






