Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.doc
Скачиваний:
6
Добавлен:
25.04.2019
Размер:
1.34 Mб
Скачать

5.2. Параметры и аргументы шаблонов

Одним из важных вопросов в работе с шаблонами классов является механизм параметров и аргументов. Мы уже кратко затрагивали этот вопрос, теперь же рассмотрим параметры и аргументы шаблонов подробно.

Параметры шаблона классов служат для обозначения общих свойств классов, объединяемых данным шаблоном. Они могут обозначать типы, классы, переменные и константы, которые могут быть подставлены в точку инстанцирования шаблона. Аргументы шаблона непосредственно представляют типы, классы, переменные и константы, подставляемые в точках инстанцирования, реализации и специализации шаблонов вместо соответствующих параметров.20 Напомним, что шаблон должен включать хотя бы один параметр. Максимальное количество параметров шаблона при этом не ограничивается.

Шаблонный класс может иметь три вида параметров. Наиболее распространены среди них параметры-типы (type-parameters). Параметры этого вида обозначают обобщенные типы (мы уже видели их применение выше в шаблоне CVector). Их можно использовать внутри определения шаблона для задания типов локальных переменных и функций, типов параметров функций и т.д. Другой вид параметров шаблона – шаблонные параметры (template parameters). Их назначение состоит в обобщении других параметров (например, с их помощью можно переписать шаблон CVector так, что он сможет хранить свои элементы в любом контейнере, а не только в одномерном динамическом массиве). Третий вид параметров шаблонов – ординарные параметры21. Эти параметры задаются как обычные параметры функций (декларации) путем указания идентификатора некоторого типа (встроенного или определенного пользователем) и неквалифицированного имени параметра. Одна из целей использования ординарных параметров – введение ограничений (например, с их помощью вместо шаблона, представляющего векторы «вообще», можно ввести шаблон, моделирующий векторы заданной длины).

Рассмотрим синтаксис параметров шаблонов.

Параметры-типы записываются в одном из следующих форматов:

Class identifier typename identifier

где identifier – это имя параметра. Смысловых различий при использовании служебных слов class и typename нет. Для записи шаблонных параметров шаблонов применяется такой формат:

template <template_parameter_list> class identifier

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

cv-modifiers type identifier

где type – стандартный или пользовательский тип, cv-modifiers – модификаторы (например, const), identifier – имя параметра.

Для иллюстрации ниже дан набросок определения шаблона классов, моделирующего понятие «бинарное отображение», где используются различные виды параметров:

template <class Key, class Data, int Len,

template <class T, int L> class Container>

// Key, Data – параметры-типы (типы ключа и данных отображения)

// Len – ординарный параметр (ограничение на длину контейнера)

// Container – контейнер, где содержится информация отображения class сMap {

Container <Key, Len> __key;

Container <Data, Len> __data;

...

};

Параметры шаблонных классов всех трех видов могут иметь значения по умолчанию. Их роль такая же, как и у функций: если аргумент отсутствует, то вместо него подставляется соответствующее умалчиваемое значение. Однако это значение используется при инстанцировании классов из шаблона. Для задания значения по умолчанию используется символ =, за которым следует выражение. Задать такое значение можно либо в декларации, либо в определении шаблона (и там, и там одновременно его задание запрещено и рассматривается как переопределение умалчиваемого значения). Для параметров-типов значением по умолчанию может быть идентификатор типа. Формат записи параметра-типа с учетом этого значения таков (отметим, что identifier может отсутствовать):

class identifier = type-id

typename identifier = type-id

Для шаблонных параметров значение по умолчанию – это выражение-идентификатор (id-expression). Формат записи шаблонного параметра с учетом значения по умолчанию будет таким:

template <template_parameter_list> class identifier = id-expression

Для ординарных параметров формат с умалчиваемым значением такой же, как и у функций.

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

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

Пример

template <class T> class CSomeClass { /* ... */ };

template <class U> class CAnotherClass { /* ... */ };

...

template <class C1 = int, class C2 = C1,

template <class T> class F = CSomeClass, C2 p = 0>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]