Анимация
JavaScript
|
Главная Библионтека 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>
Окончание табл. 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 |