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

5.3. Шаблоны компонентных функций

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

Шаблон компонентных функций может быть определен как внутри класса (шаблона классов), так и за его пределами. Формат «внутреннего» определения при этом ничем не отличается от формата определения обычного шаблона функций и имеет вид:

template <template_parameter_list>

Value_type function_template_id(function_parameter_list) { statements }

где function_template_id – имя шаблона функций; function_parameter_list – список параметров функции; value_type – тип возвращаемого функцией значения; statements – операторы тела шаблона. При внешнем определении необходима полная квалификация имени шаблона функций и указание списков параметров как для шаблона функций, так и для шаблона классов (если шаблон функций входит в обычный класс, то, очевидно, нужны только параметры шаблона функций). Формат внешнего определения шаблона функций при его вхождении в шаблон классов следующий:

template <class_template_parameter_list> template <function_template_parameter_list> value_type class_template_id<class_template_arguments>

::Function_template_id(function_parameter_list) { statements }

где class_template_parameter_list и function_template_parameter_list – списки параметров, соответственно, шаблона классов и шаблона компонентных функций; class_template_id<class_template_arguments> – полный идентификатор шаблона классов; function_template_id – имя шаблона компонентных функций (остальные элементы формата очевидны).

Ниже приведен пример определения шаблона классов с шаблонами компонентных функций.

Пример

template <class T> class CMyString { // строка символов

public:

// шаблон с внешним определением (сравнение строк)

template <class T2> int compare(const CMyString<T2> &);

// шаблон с внутренним определением (конструктор копирования)

template <class T2> CMyString(const CMyString<T2> & s2) { /* ... */ }

...

};

// внешнее определение шаблона компонентных функций

template <class T> template <class T2>

int CMyString<T>::compare(const CMyString<T2> & s2)

{ /* ... */ }

Используя шаблоны компонентных функций, нужно помнить об ограничениях, накладываемых на них стандартом языка С++. Так, шаблоны компонентных функций не могут быть виртуальными; их нельзя вводить в локальные классы. Кроме того, их нельзя использовать в качестве деструкторов (но можно в качестве конструкторов). Если шаблон компонентной функции при каком-то сочетании аргументов генерирует функцию, совпадающую по сигнатуре с обычной компонентной функцией, то последней при вызове отдается «предпочтение». Шаблоны компонентных функций могут входить во вложенные классы и шаблоны классов, а также являться дружественными по отношению к другим классам и шаблонам классов.

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