Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [ 18 ] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105

2.11. Резюме

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

• Статические диагностические утверждения (раздел 2.1) позволяют библиотекам генерировать осмысленные сообщения об ошибках.

• Частичная шаблонная специализация (раздел 2.2) позволяет специализировать шаблоны не для фиксированного специального набора параметров, а для семейства параметров, наиболее соответствующих заданному шаблону.

• Локальные классы (раздел 2.3) допускают интересные возможности, особенно в отношении шаблонных функций.

• Отображение целочисленных констант в типы (раздел 2.4) облегчает процесс статической диспетчеризации, основанной на числовых значениях (особенно булевского типа).

• Отображение между типами (раздел 2.5) позволяет заменить перегрузку функций частичной специализацией шаблонов (свойство, которого в стандарте языка С++ нет).

• Выбор типов (раздел 2.6) позволяет выбирать типы на основе анализа условных выражений.

• Распознавание конвертируемости и наследования на этапе компиляции (раздел 2.7) дает возможность получать информацию о том, можно ли преобразовать два заданных типа друг в друга, являются они псевдонимами одного и того же типа или наследуют свойства друг друга.

• Класс Typelnfo (раздел 2.8) реализует оболочку для класса std: : type info, определяя семантику значений и операции сравнения.

• Классы NullType и EmptyType (раздел 2.9) играют роль структурного нуля в ме-тапрограммировании шаблонов.

• Шаблон TypeTraits (раздел 2.10) предоставляет множество характеристик общего предназначения, которые можно использовать для настройки кода на специфическую категорию типов.

Таблица 2.1. Члены класса TypeTraits<T>

Описание

isPointer

Булевская константа

Принимает значение true, если класс Т является параметром

PointeeType

Яйпяется типом, на который ссылается тип Т, если класс Т является указателем, в противном случае является типом NullType

isReference

Булевская константа

Принимает значение true, если класс Т является ссылочным типом

ReferencedType

Если класс Т является ссылочным типом, класс ReferencedType является типом, на который ссылается класс Т. В противном случае класс ReferencedType сам является кпассом т



Окончание табл. 2.1

Описание

ParameterType

isConst

NonConstType

isvolatile

NonVolatileType NonQuali fi edType isStdUnsignedlnt

isStdSignedint

isStdlntegral isStdFloat

isStdArith

Булевская константа Тип

Булевская констанТа

Тип Тип

Булевская константа

Булевская константа

Булевская константа Булевская константа

Булевская константа

isStdFundamental Булевская константа

Оптимально соответствует параметру неизменяемой функции. Может быть либо типом т, либо типом const т&

Принимает значение true, если класс Т является константным типом

Удаляет квалификатор const у типа Т, если он у него есть

Принимает значение true, если класс Т является типом с квалификатором volatile

Удаляет квалификатор volatile у типа Т, если он у него есть

Удаляет квaJификaтopы const и volatile у типа Т, если они у него есть

Принимает значение true, если класс Т является одним из следующих четырех беззнаковых типов (unsigned char, unsigned short int, unsigned int или unsigned long int)

Принимает значение true, если класс Т является одним из следующих четырех типов со знаком (signed char, short int, signed int или long int)

Принимает значение true, если класс Т является обычным целочисленным типом

Принимает значение true, если класс Т является обычным типом чисел с плавающей точкой (float, double или long double)

Принимает значение true, если класс Т является стандартным арифметическим типом (целочисленны.м или с плавающей точкой)

Прини.мает значение true, если класс Т является основным типом (арифметическим или void)



Списки типов

Списки типов представляют собой средство для манипулирования коллекциями типов. При этом к типам можно применять все основные операции, предусмотренные для обычных списков.

В некоторых шаблонах проектирования описываются коллекции типов, над которыми производятся манипуляции. Эти типы либо связаны между собой отношением наследования, либо не зависят друг от друга. Яркими примерами таких шаблонов проектирования являются шаблоны Abstract Factory и visitor (Gamma et al., 1995). Используя традиционные методы профаммирования, можно манипулировать коллекциями типов с помошью явного повторения. Это приводит к раздуванию кода. Многие люди считают, что ничего лучше придумать нельзя. Однако списки типов позволяют автоматизировать задачи, которые профаммисты обычно решают с помошью макросов редактора. Списки типов придают языку С++ необычайную мошь, позволяя создавать новые, интересные идиомы.

В этой главе содержится полное описание возможностей списков типов в языке С++, а также приводятся многочисленные примеры их применения. Здесь представлена следующая информация.

• Концепция списков типов.

• Способы создания и функционирования списков типов.

• Методы эффективного манипулирования списками типов.

• Применение списков типов и программирование идиом, поддерживаемых списками типов.

В главах 9-11 показано, как списки типов используются в качестве технологии профаммирования.

3.1. Зачем нужны списки типов

Иногда нужно написать один и тот же код для большого количества разных типов, и шаблоны тут ничем не могут помочь. Рассмотрим, например, реализацию шаблона Abstract Factory (Gamma et al., 1995). Ниже приведено определение виртуальной функции для каждого типа из некоторого набора, заданного на этапе проектирования.

class widgetFactory

public:

virtual window* CreateWindowO = 0; virtual Button* CreateButtonQ = 0; virtual scrollBar* CreateScrollBarQ = 0;



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [ 18 ] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105