14. Параметрический полиморфизм.
В С++ используется ключевое слово template для обеспечения параметрического полиморфизма. Параметрический
полиморфизм позволяет одному и тому же коду использоваться относительно
различных типов, где тип - параметр тела кода. Шаблоны определения класса и
шаблоны определения функции дают возможность многократно использовать код
простым способом, безопасным по отношению к типу, который позволяет компилятору
автоматизировать процесс реализации типа.
Шаблоны функций.
Цель введения шаблонов функций - автоматизация создания
функций, которые могут обрабатывать разнотипные данные. В отличие от механизма
перегрузки, когда для каждой сигнатуры определяется своя функция, шаблон
семейства функций определяется один раз, но это определение параметрируется.
Параметризировать в шаблоне можно функции можно тип возвращаемого функцией
значения и типы любых параметров, количество и порядок которых должны быть
фиксированы.
Шаблон семейства функций состоит из двух частей - заголовка
шаблона template <class
идентификатор> , где идентификатор - параметр
шаблона, который, по существу, замещает произвольный тип, и из обыкновенного
определения функции, в котором тип возвращаемого значения и типы любых
параметров обозначаются именами параметров шаблона, введенных в его заголовке.
Те же имена параметров шаблона могут использоваться и в теле определения
функции для обозначения типов локальных объектов.
По существу механизм шаблонов функций позволяет
автоматизировать подготовку определений перегруженных функций. При
использовании шаблонов уже нет необходимости готовить заранее все варианты
функций с перегруженным именем. Компилятор автоматически, анализируя вызовы
функций в тексте программы, формирует необходимые определения именно для таких
типов параметров, которые использованы в обращениях. Дальнейшая обработка
выполняется так же, как и для перегруженных функций.
Основные свойства параметров шаблона:
1. Имена
параметров шаблона должны быть уникальными всем определении шаблона.
2. Список
параметров шаблона функции не может быть пустым, так как при этом теряется
возможность параметризации и шаблон функции становиться обычным определением
конкретной функции.
3. В списке
параметров шаблона функции может быть несколько параметров. Каждый из них
должен начинаться со служебного слова class.
4. Недопустимо использовать в заголовке шаблона параметры с
одинаковыми именами
5. Имя параметра шаблона имеет в определяемом шаблоном функции все
права имени типа, т.е. с его помощью могут специализироваться формальные
параметры, определяться тип возвращаемого функцией значения и типы любых объектов,
локализованных в теле функции.
Шаблоны классов.
Аналогично шаблону функций определяется шаблон семейства
классов template <class
идентификатор>
Шаблон семейства классов определяет способ построения
отдельных классов подобно тому, как класс определяет правила построения и
формат отдельных объектов. В определении класса, входящего в шаблон, особую
роль играет имя класса. Оно является параметризированным именем семейства
классов.
Когда шаблон введен, у программиста появляется возможность
определить конкретные объекты конкретных классов, каждый из которых, параметрически порожден из шаблона. Формат определения
объекта одного из классов, порождаемых шаблоном классов:
имя_параметризованного_класса
<фактические_параметры_шаблона>
имя_объекта(параметры_конструктора);
В нашем случае определить вектор, имеющий восемь
вещественных координат типа double, можно следующим
образом:
Vector <double>
Z(8);
Использование имя Vector без указания фактического параметра шаблона нельзя - никакое умалчиваемое значение при этом не предусматривается.