Родовые подпрограммы в языке C++
- объявление функции, которая может иметь параметры шаблона
Запись в угловых скобках аналогична списку параметров в обычной функции.
Функция-шаблон должна иметь хотя бы один родовой параметр, представляемый в одной из следующих форм:1. class имя_родового_параметра
2. typename имя_родового_параметра
368 |
Глава 13. Подпрограммы |
Первую форму целесообразно использовать для задания параметров, которые являются именами классов. Вторая форма применяется для указания имени типа. Первая форма была придумана давно, а вторая форма появилась много позже и более прозрачно отражает ее смысл, поскольку родовой параметр обозначает место для подстановки имени фактического типа. В данном контексте стандарт С++ рассматривает оба эти ключевых слова как идентичные. В качестве примера повторим объявление функции-шаблона, приведенной в подразделе «Параметрический полиморфизм»: г один формальный родовой параметр T (ука- зывает тип данных, с которыми работает функция) и два обычных формальных параметра-ссылки х и у. Экземпляры данной функции-шаблона можно создавать для работы с любым типом данных, для которого определена операция присвоения. Например, экземпляр подпрограммы для типа int в качестве параметра может иметь следующий вид:
Здесь тоже один формальный родовой параметр T и два обычных формальных параметра а и b. По параметру T функция настраивается на тип обрабатываемых данных, а по параметрам а и b — на их значения. В теле функции использован условный оператор ?, логика работы которого состоит в анализе условия, стоящего слева от знака вопроса, и (при его истинном значении) возврате (в качестве результата) значения первого операнда, стоящего справа от знака вопроса. В противном случае возвращается значение второго операнда, стоящего после двоеточия. По сути, оператор ? моделирует логику работы обычного оператора if-then-else, но имеет «загадочный» внешний вид и лаконичную форму. Он удобен в тех случаях, когда в тексте программы надо указать единственное место появления «условного» результата.Экземпляры функции-шаблона в языке C++ создаются неявно, при обработке оператора вызова функции. Причем абсолютно неважно, что именно указано в операторе вызова функции: ее имя или ее адрес, полученный с помощью операции &. Например, экземпляр функции-шаблона max в приведенном фрагменте создается дважды — для параметров типа int и типа char соответственно: int а, b, с; char x, y, z; с = max(a, b); z = max(x, y); Объявим процедуру-шаблон для сортировки массивов любого типа: |
Родовые подпрограммы |
369 |
Экземпляр этого шаблона появляется, например, при обработке следующего вызова:
Подпрограммы-шаблоны в языке С++ отдаленно напоминают подпрограммы, в которых типы формальных параметров при вызове динамически связываются с типами фактических параметров. В «динамических» подпрограммах нужен лишь один экземпляр кода, в то время как шаблоны требуют создания (в период компиляции) копии кода для каждого отдельного типа, кроме того, связывание операторов вызова с подпрограммами также осуществляется статически. |