Язык программирования C++


Функции-шаблоны


Запишем алгоритм поиска минимума двух величин, где в качестве параметра используется тип этих величин.

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 для класса String s1 = min(s2, s3); . . . // генерация функции min для типа int x = 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> InIterator find(InIterator first, InIterator last, const T& val);

Класс T – это тип элементов интервала. Тип InIterator – тип указателя на его начало и конец.




Начало  Назад  Вперед



Книжный магазин