Функция с двумя обобщенными типами



 

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

 

 

В этом примере при выполнении функции main(), когда компилятор генерирует конкретные экземпляры функции myfunc() , заполнители типов type1 и type2 заменяются сначала парой типов данных int и char* , а затем парой double и long соответственно.

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

 

Явно заданная перегрузка обобщенной функции

 

"Вручную" перегруженная версия обобщенной функции называется явной специализацией.

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

 

 

При выполнении эта программа генерирует такие результаты.

 

 

Как отмечено в комментариях, при вызове функции swapargs(i, j) выполняется явно перегруженная версия функции swapargs() , определенная в программе. Компилятор в этом случае не генерирует эту версию обобщенной функции swapargs() , поскольку обобщенная функция переопределяется явно заданным вариантом перегруженной функции.

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

 

 

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

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

 

Перегрузка шаблона функции

 

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

 

 

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

 

Использование стандартных параметров в шаблонных функциях

 

В шаблонных функциях можно смешивать стандартные параметры с обобщенными параметрами типа. Эти параметры работают так же, как в любой другой функции. Рассмотрим пример.

 

 

Вот какие результаты генерирует эта программа.

 

 

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

 


Дата добавления: 2018-09-22; просмотров: 359; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!