Шаблоны функций
Объявление шаблона функции начинается с заголовка, состоящего из ключевого слова template, за которым следует список параметров шаблона.
// Описание шаблона функции
template <class X>
X min (X a, X b)
{
return a<b ? a : b;
}
Ключевое слово class в описании шаблона означает тип, идентификатор в списке параметров шаблона X означает имя любого типа.
В описании заголовка функции этот же идентификатор означает тип возвращаемого функцией значения и типы параметров функции.
...
// Использование шаблона функции
int m = min (1, 2);
...
Экземпляр шаблона функции породит, сгенерированный компилятором
int min (int a, int b)
{
return a<b ? a : b;
}
В списке параметров шаблона слово class может также относится к обычному типу данных. Таким образом, список параметров шаблона <class T> просто означает, что Т представляет собой тип, который будет задан позднее. Так как Т является параметром, обозначающим тип, шаблоны иногда называют параметризованными типами.
Приведем описание шаблона функции
template <class T>
T toPower (T base, int exponent)
{
T result = base;
if (exponent==0) return (T)1;
if (exponent<0) return (T)0;
while (--exponent) result *= base;
return result;
}
Переменная result имеет тип Т, так что, когда передаваемое в программу значение есть 1 или 0, то оно сначала приводится к типу Т, чтобы соответствовать объявлению шаблона функции.
Типовой аргумент шаблона функции определяется согласно типам данных, используемых в вызове этой функции:
int i = toPower (10, 3);
long l = toPower (1000L, 4);
double d = toPower (1e5, 5);
В первом примере Т становится типом int, во втором - long. Наконец, в третьем примере Т становится типом double. Следующий пример приведет к ошибке компиляции, так как в нем используются разные типы данных:
int i = toPower (1000L, 4);