Анимация
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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 [ 218 ] 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239

возвращаемые этими функциями, зависят от имени, переданного в аргументе конструктора. Если бы в качестве базового использовался класс numpunct, то поведение этих функций было бы жестко фиксированным. Класс germanBoolNames переопределяет две функции, определяющие текстовое представление значений true и false.

Чтобы использовать этот фацет в локальном контексте, необходимо создать новый объект локального контекста при помощи специального конструктора класса locale. В первом аргументе этого конструктора передается объект локального контекста, а во втором - указатель на фацет. Созданный локальный контекст идентичен первому аргументу во всем, кроме фацета, переданного во втором аргументе. Заданный фацет устанавливается в созданном объекте контекста после копирования первого аргумента:

std::locale loc (std::locale(""). new germanBoolNamesC"));

Подвыражение new создает фацет, устанавливаемый в новом локальном контексте. Таким образом, фацет регистрируется в loc для создания специализированной версии localeC"). Поскольку прямая модификация объектов локального контекста невозможна, для установки нового фацета в локальном контексте придется создать новый объект локального контекста. Этот новый объект используется так же, как любой другой объект локального контекста. Например, рассмотрим такой фрагмент:

std;:cout.imbue(1oc);

std::cout « std::boolalpha « true « std::endl: Этот фрагмент выдает следующий результат: wahr

Вы также можете создать абсолютно новый фацет. В этом случае функция has facetO позволяет узнать, был ли этот новый фацет зарегистрирован для заданного объекта локального контекста.

Строение объекта локального контекста

Локальный контекст С++ представляет собой неизменяемый контейнер для фацетов. Класс locale определяется в заголовочном файле <1оса1е> следующим образом:

namespace std { class locale { public;

Глобальные объекты локальных контекстов

static const locales classicO: Классический локальный контекст С static locale globaKconst locale&); Глобальное назначение

локального контекста

Внутренние типы и значения class facet; class id;



typedef 1nt category:

static const category none, numeric, time, monetary,

ctype. collate, messages, all;

Конструкторы localeO throwO;

explicit locale (const char* name);

Создание локального контекста на базе существующих контекстов locale (const locale& loc) throwO; locale (const locale& loc. const char* name, category); template <class Facet>

locate (const locale& loc. Facet* fp): locale (const locale& loc. const locale& loc2. category):

Оператор присваивания

const localeSi operator= (const locale& loc) throwO: template <class Facet> locale combine (const locale& loc):

Деструктор -localeO throwO;

Имя (если есть) basic string<char> nameO const:

Сравнения

bool operator== (const localeS loc) const; bool operator! (const localeS loc) const;

Сортировка строк

template <class charT. class Traits, class Allocator> bool OperatorO ( const basic str1ng<charT.Traits.Allocator>& si. const basic string<charT.Traits.Allocator>& s2) const;

Работа с фацетами template <class Facet>

const Facets use facet (const localeS); template <class Fdcet>

bool has facet (const locale&) throwO:

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



контекстам возвращали тип, соответствующий индексу; именно это и происходит при «индексировании» по типу фацета. Другое достоинство этого механизма состоит в том, что интерфейс безопасен по отношению к типам.

Объекты локальных контекстов неизменны. Это означает, что фацеты, хранящиеся в локальных контекстах, невозможно модифицировать (кроме присваивания локальных контекстов). Модификации локальных контекстов создаются посредством объединения существующих контекстов и фацетов с формированием нового контекста. В табл. 14.4 перечислены конструкторы локальных контекстов.

Таблица 14.4. Конструкторы локальных контекстов Выражение Описание

1оса1е() Создает копию текущего локального контекста,

назначенного глобально

locale(name) Создает объект локального контекста для заданного имени

locale(loc) Создает копию локального контекста loc

1оса1е(1ос, 1ос2, cat) Создает копию локального контекста loci, в которой

все фацеты из категории cat заменяются фацетами локального контекста 1ос2

1оса1е(1ос, name, cat) Эквивалент 1оса1е(1ос, locaie(name), cat)

locaie(loc,fp) Создает копию локального контекста ioc и устанавливает

фацет, на который ссылается указатель fp

loci ~ 1ос2 Присваивает локальный контекст 1ос2 объекту loci

locl.tempiate combine<F>(loc2) Создает копию локального контекста loci, в которой

фацет типа F берется из 1ос2

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

Два конструктора из табл. 14.4 получают имена локальных контекстов. Передаваемые имена не стандартизированы (кроме имени С). Однако стандарт требует, чтобы в документации, прилагаемой к стандартной библиотеке С++, были перечислены допустимые имена. Предполагается, что большинство реализаций поддерживает имена, представленные на с. 664.

Функцию combine() стоит пояснить подробнее, поскольку в ней используется возможность, относительно недавно реализованная в компиляторах. Она представляет собой шаблонную функцию с явно заданным аргументом. Это означает, что тип аргумента шаблона не определяется по значению аргумента, поскольку такого значения попросту нет. Вместо дтого аргумеьгг шаблона (в данном случае ~ тип F) задается явно.



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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 [ 218 ] 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239