7.3.5 Обобщенные Классы
7.3.5 Обобщенные Классы
Очевидно, можно было бы определить списки других типов (classdef*, int, char* и т.д.) точно так же, как был опредлен класс nlist: простым выводом из класса slist. Процесс оределения таких новых типов утомителен (и потому чреват ошиками), но с помощью макросов его можно «механизировать». К сожалению, если пользоваться стандартным C препроцессором (#4.7 и #с.11.1), это тоже может оказаться тягостным. Однако полученными в результате макросами пользоваться довольно просто.
Вот пример того, как обобщенный (generic) класс slist, названный gslist, может быть задан как макрос. Сначала для написания такого рода макросов включаются некоторые инстрменты из «generic.h»:
#include «slist.h»
#ifndef GENERICH #include «generic.h» #endif
Обратите внимание на использование #ifndef для того, чтобы гарантировать, что «generic.h» в одной компиляции не будет включен дважды. GENERICH определен в «generic.h».
После этого с помощью name2(), макроса из «generic.h» для конкатенации имен, определяются имена новых обобщенных
классов:
#define gslist(type) name2(type,gslist) #define gslist_iterator(type) name2(type,gslist_iterator)
И, наконец, можно написать классы gslist(тип) и gslist_iterator(тип):
#define gslistdeclare(type) struct gslist(type) : slist (* int insert(type a) (* return slist::insert( ent(a) ); *) int append(type a) (* return slist::append( ent(a) ); *) type get() (* return type( slist::get() ); *) gslist(type)() (* *) gslist(type)(type a) : (ent(a)) (* *) ~gslist(type)() (* clear(); *) *); struct gslist_iterator(type) : slist_iterator (* gslist_iterator(type)(gslist(type) amp; a) : ( (slist amp;)s ) (**) type operator()() (* return type( slist_iterator::operator()() ); *) *)
на конце строк указывает , что следующая строка явлется частью определяемого макроса.
С помощью этого макроса список указателей на имя, аналгичный использованному раньше классу nlist, можно определить так:
#include «name.h»
typedef name* Pname; declare(gslist,Pname); // описывает класс gslist(Pname)
gslist(Pname) nl; // описывает один gslist(Pname)
Макрос declare (описать) определен в «generic.h». Он конкатинирует свои параметры и вызывает макрос с этим именем, в данном случае gslistdeclare, описанный выше. Параметр имя типа для declare должен быть простым именем. Используемый мтод макроопределения не может обрабатывать имена типов вроде name*, поэтому применяется typedef.
Использование вывода класса гарантирует, что все частные случаи обобщенного класса разделяют код. Этот метод можно применять только для создания классов объектов того же размра или меньше, чем базовый класс, который используется в маросе. gslist применяется в #7.6.2.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Обобщенные алгоритмы
Обобщенные алгоритмы В заголовочном файле <QtAlgorithms> объявляются глобальные шаблонные функции, которые реализуют основные алгоритмы для контейнеров. Большинство этих функций работают с итераторами в стиле STL.Заголовочный файл STL <algorithm> содержит более полный набор
Что такое обобщенные указатели и почему они полезны
Что такое обобщенные указатели и почему они полезны Представим себе некий объект, который имеет перегруженную операцию operator->(). Мы можем его представить себе как некий обобщенный указатель, который не является указателем в полном смысле этого слова, но «прикидывается»
Обобщённые численные операции (Generalized numeric operations)
Обобщённые численные операции (Generalized numeric operations) Накопление (Accumulate) template ‹class InputIterator, class T›T accumulate(InputIterator first, InputIterator last, T init);template ‹class InputIterator, class T, class BinaryOperation›T accumulate(InputIterator first, InputIterator last, T init, BinaryOperation binary_op);accumulate подобен оператору APL reduction и функции Common Lisp reduce, но он
6.6.3. Обобщенные алгоритмы
6.6.3. Обобщенные алгоритмы Операции, описанные в предыдущих разделах, составляют набор, поддерживаемый непосредственно контейнерами vector и deque. Согласитесь, что это весьма небогатый интерфейс и ему явно не хватает базовых операций find(), sort(), merge() и т.д. Планировалось
12. Обобщенные алгоритмы
12. Обобщенные алгоритмы В нашу реализацию класса Array (см. главу 2) мы включили функции-члены для поддержки операций min(), max() и sort(). Однако в стандартном классе vector эти, на первый взгляд фундаментальные, операции отсутствуют. Для нахождения минимального или максимального
12.5. Обобщенные алгоритмы
12.5. Обобщенные алгоритмы Первые два аргумента любого обобщенного алгоритма (разумеется, есть исключения, которые только подтверждают правило) – это пара итераторов, обычно называемых first и last, ограничивающих диапазон элементов внутри контейнера или встроенного массива,
12.6. Когда нельзя использовать обобщенные алгоритмы
12.6. Когда нельзя использовать обобщенные алгоритмы Ассоциативные контейнеры (отображения и множества) поддерживают определенный порядок элементов для быстрого поиска и извлечения. Поэтому к ним не разрешается применять обобщенные алгоритмы, меняющие порядок, такие,
13. Классы
13. Классы Механизм классов в C++ позволяет пользователям определять собственные типы данных. По этой причине их часто называют пользовательскими типами. Класс может наделять дополнительной функциональностью уже существующий тип. Так, например, IntArray, введенный в главе 2,
21. Обобщенные алгоритмы в алфавитном порядке
21. Обобщенные алгоритмы в алфавитном порядке В этом приложении мы рассмотрим все алгоритмы. Мы решили расположить их в алфавитном порядке (за небольшими исключениями), чтобы проще было найти нужный. Каждый алгоритм представлен в следующем виде: сначала описывается
Обобщенные типы
Обобщенные типы Обобщенные типы: обзор Обобщенным типом (generic) называется шаблон для создания класса, записи или интерфейса, параметризованный одним или несколькими типами. Класс (запись, интерфейс) образуется из шаблона класса (записи, интерфейса) подстановкой
Обобщенные типы: обзор
Обобщенные типы: обзор Обобщенным типом (generic) называется шаблон для создания класса, записи или интерфейса, параметризованный одним или несколькими типами. Класс (запись, интерфейс) образуется из шаблона класса (записи, интерфейса) подстановкой конкретных типов в
Обобщенные подпрограммы в качестве параметров
Обобщенные подпрограммы в качестве параметров Обобщенная подпрограмма может выступать в качестве формального параметра другой обобщенной подпрограммы.Например, в классе System.Array имеется несколько статических обобщенных методов с обобщенными подпрограммами в качестве
Отложенные классы как частичные интерпретации: классы поведения
Отложенные классы как частичные интерпретации: классы поведения Не все отложенные классы так близки к АТД как STACK. В промежутке между полностью абстрактным классом, таким как STACK, в котором все существенные компоненты отложены, и эффективным классом, таким как FIXED_STACK,