Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

2.3. Шаблоны 91

всего один параметр T. Ключевое слово «typename» указывает, что T - название

некоторый тип. (Более старые версии C ++ не поддерживают это ключевое слово, и вместо этого ключевое слово «класс» должно использоваться.) Мы можем иметь другие типы параметров шаблона, целые числа, например, но ввести имена, наиболее распространены. Заметьте, что параметр типа T занимает место «интервала» в оригинальном определении функции genericMin.

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

суд <<genericMin (3, 4) <<'' //= genericMin <интервал> (3,4)

<<genericMin (1.1, 3.1) <<'' //= genericMin <дважды> (1.1, 3.1)

<<genericMin ('t', 'g') <<endl;//= genericMin <случайная работа> ('t', 'g')

Тип шаблона не должен быть фундаментальным типом. Мы могли использовать любого

напечатайте в этом примере, при условии, что меньше, чем оператор (<) определен для этого типа.

2.3.2 Шаблоны класса

Кроме того, функционировать шаблоны, C ++ позволяет классам быть templated, который является a

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

Давайте считать пример шаблона для ограниченного класса BasicVector, который хранит вектор элементов, который является упрощенной версией структуры, обсужденной более подробно в Главе 6. У этого класса есть конструктор, которому дают размер множества, чтобы ассигновать. Чтобы получить доступ к элементам множества, мы перегружаем оператора индексации» []."

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

шаблон <typename T>

класс BasicVector

общественность:

BasicVector (интервал capac = 10); T& оператор [] (интервал i)

возвращаются [я];

//... опущены другие общественные участники

частный:

T * a; международная способность;

;

//

// //

// //

простой векторный класс

доступ конструктора s el ement во мне ndex i

множество, хранящее длину элементов множества a

92

Глава 2. Ориентированный на объект Дизайн Мы определили одну членскую функцию (оператор индексации) в пределах тела класса, и ниже мы показываем, как другая членская функция (конструктор) может быть определена вне тела класса. Конструктор инициализирует полную стоимость и ассигнует хранение множества.

шаблон <typename T> //конструктор

BasicVector <T>:: BasicVector (интервал capac)

способность = capac;

a = новый T [способность]; //ассигнуют хранение множества

Чтобы иллюстрировать примерами конкретный случай класса BasicVector, мы обеспечиваем название класса, сопровождаемое фактическим параметром типа, приложенным в угловых скобках (<...>). Кодовый фрагмент ниже показывает, как мы определили бы три вектора, один из интервала типа, один из типа дважды и одну из последовательности типа.

BasicVector <интервал> iv (5); //вектор 5 целых чисел

BasicVector <двойной> dv (20); //вектор 20 удваивает BasicVector <последовательность> sv (10); //вектор 10 последовательностей

Так как мы перегрузили оператора индексации, мы можем получить доступ к элементам каждого множества таким же образом, как мы были бы для любого C ++ множество.

iv[3] = 8; dv[14] = 2.5; sv[7] = «привет»;

Аргументы Templated

Фактический аргумент в экземпляре шаблона класса может самостоятельно быть templated

напечатать. Например, мы могли создать BasicVector, отдельные элементы которого имеют самостоятельно тип BasicVector <интервал>.

BasicVector <BasicVector <интервал>> xv (5);//вектор векторов//... xv[2][8] = 15;

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

Обратите внимание на то, что в декларации xv выше, мы преднамеренно оставили пространство после» <интервала>». Причина состоит в том, что без пространства, комбинация характера»>>» интерпретировалась бы как bitwise оператор правильного изменения компилятором (см. Секунду - tion 1.2).