Запишем алгоритм поиска минимума двух величин, где в качестве параметра используется тип этих величин.
template <class T>const T& min(const T& a, const T& b){ if (a < b) return a; else return b;} Данная запись еще не создала ни одной функции, это лишь шаблон для определенной функции. Только тогда, когда происходит обращение к функции с аргументами конкретного типа, будет выполнена генерация конкретной функции.
int x, y, z;String s1, s2, s3;. . .// генерация функции min для класса Strings1 = min(s2, s3);. . .// генерация функции min для типа intx = min(y, z); Первое обращение к функции min генерирует функцию
const String& min(const String& a, const String& b); Второе обращение генерирует функцию
const int& min(const int& a, const int& b); Объявление шаблона функции min говорит о том, что конкретная функция зависит от одного параметра – типа T. Первое обращение к min в программе использует аргументы типа String. В шаблон функции подставляется тип String вместо T. Получается функция:
const String& min(const String& a, const String& b){ if (a < b) return a; else return b;} Эта функция компилируется и используется в программе. Аналогичные действия выполняются и при втором обращении, только теперь вместо параметра T подставляется тип int. Как видно из приведенных примеров, компилятор сам определяет, какую функцию надо использовать, и автоматически генерирует необходимое определение.
У функции-шаблона может быть несколько параметров. Так, например, функция find библиотеки STL (стандартной библиотеки шаблонов), которая ищет первый элемент, равный заданному, в интервале значений, имеет вид:
template <class InIterator, class T>InIteratorfind(InIterator first, InIterator last, const T& val); Класс T – это тип элементов интервала. Тип InIterator – тип указателя на его начало и конец.