Глава 19. Классы-шаблоны 515

h05151.jpg

Средство

Условие использования

Аргументы по умолчанию Перегрузка функций

Шаблоны Полиморфизм

Аргументы имеют предпочтительные значения

Функции семантически подобны (например, печать), но отличаются типы данных

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

В главе 20 вы увидите, как эта сторона C++ обеспечивает гибкость при работе с типами данных во время выполнения программ


Родовые функции

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

Начнем с примера определения функции, обменивающей значениями два аргумента (такая функция часто используется в алгоритмах сортировки данных). Поскольку функция невелика, мы используем спецификатор inline. Для пробы начнем с функции, переставляющей два целых числа.

inline void Swap( int& a, int& b) ( int t = a; a = b; b = t; }

Заметим, что функция принимает значения по ссылке. Это означает, что функция обменивает значения реальных аргументов, а не их копий (см. главу 17). Как видите, реализация функции перестановки достаточно проста.

Теперь выделим те данные, которые являются для функции основными, и сделаем их параметризованными аргументами. В нашем случае — это целые, передаваемые по ссылке. Синтаксис функции шаблона выглядит так:

template <class T> [спецификатор] возвращаемый_тип имя функции ([список аргументов]);

тогда наша функцид, примет вид, , ^ , , , '

template <class T> inline void Swap ( T& a, TS Ь) ( Т t = а; а = b; b = t; } '

Тип параметра располагается в угловых скобках о после ключевого слова template (этот оператор по традиции помещается в строке, предшествующей