14. Параметрический полиморфизм.

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

Шаблоны функций.

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

Шаблон семейства функций состоит из двух частей - заголовка шаблона template <class идентификатор> , где идентификатор - параметр шаблона, который, по существу, замещает произвольный тип, и из обыкновенного определения функции, в котором тип возвращаемого значения и типы любых параметров обозначаются именами параметров шаблона, введенных в его заголовке. Те же имена параметров шаблона могут использоваться и в теле определения функции для обозначения типов локальных объектов.

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

Основные свойства параметров шаблона:

1.            Имена параметров шаблона должны быть уникальными всем определении шаблона.

2.            Список параметров шаблона функции не может быть пустым, так как при этом теряется возможность параметризации и шаблон функции становиться обычным определением конкретной функции.

3.            В списке параметров шаблона функции может быть несколько параметров. Каждый из них должен начинаться со служебного слова class.

4. Недопустимо использовать в заголовке шаблона параметры с одинаковыми именами

5. Имя параметра шаблона  имеет в определяемом шаблоном функции все права имени типа, т.е. с его помощью могут специализироваться формальные параметры, определяться тип возвращаемого функцией  значения и типы любых объектов, локализованных в теле функции.

Шаблоны классов.

Аналогично шаблону функций определяется шаблон семейства классов template <class идентификатор>

Шаблон семейства классов определяет способ построения отдельных классов подобно тому, как класс определяет правила построения и формат отдельных объектов. В определении класса, входящего в шаблон, особую роль играет имя класса. Оно является параметризированным именем семейства классов.

Когда шаблон введен, у программиста появляется возможность определить конкретные объекты конкретных классов, каждый из которых, параметрически порожден из шаблона. Формат определения объекта одного из классов, порождаемых шаблоном классов:

имя_параметризованного_класса

<фактические_параметры_шаблона>

имя_объекта(параметры_конструктора);

В нашем случае определить вектор, имеющий восемь вещественных координат типа double, можно следующим образом:

Vector <double> Z(8);

Использование имя Vector без указания фактического параметра шаблона нельзя - никакое умалчиваемое значение при этом не предусматривается.

Hosted by uCoz