Анимация
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

Пустая строка вместо имени локального контекста имеет особый смысл: она обозначает локальный контекст по умолчанию для окружения пользователя (обычно определяется переменной окружения LANG). Этот локальный контекст связывается со стандартным входным потоком данных командой:

cout.imbueClangLocale);

Показанное ниже выражение возвращает имя локального контекста по умолчанию в виде объекта типа string (см. главу И):

TangLocale.nameC)

Следующий фрагмент конструирует локальный контекст по имени, прочитанному из стандартного входного потока данных:

string s: cin » s;

locale cinLocale(s.c str()):

Для этого из стандартного входного потока данных читается слово, передаваемое в аргументе конструктора. Если попытка чтения завершается неудачей, во входном потоке данных устанавливается флаг ios base::failbit. Программа проверяет и обрабатывает эту ситуацию:

if (!cin) {

if (isGerman) [

сегг « "FEHLER beiro Einlesen der Sprachumgebung" « endl;

else {

cerr « "ERROR while reading the locale" « endl;

return EXITJAILURE:

Если содержимое строки не позволяет сконструировать локальный контекст, также генерируется исключение runtime error.

Если программист хочет соблюдать национальные стандарты, он должен задействовать соответствующие объекты локальных контекстов. Статическая функция globalO класса locale устанавливает новый глобальный объект локального контекста. Этот объект будет использоваться по умолчанию функциями, которым при вызове может передаваться необязательный аргумент с локальным контекстом. Если объект локального контекста, назначенный функцией global(), обладает именем, вызов global() также обеспечивает правильную реакцию со стороны функций С с поддержкой локальных контекстов. Если имя отсутствует, то результаты вызова функций С зависят от реализации.

Пример назначения глобального объекта локального контекста в зависимости от окружения, в котором выполняется программа:

std::locale::global(std:;localeC"));



В частности, информация о назначенном контексте передается функциям С, которые будут вызываться в будущем. Последствия будут такими же, как при следующем вызове:

std::setlocaTe(LC ALL."")

Тем не менее глобальное назначение локального контекста не заменяет локальные контексты, уже хранящиеся в объектах. Оно лишь заменяет объект локального контекста, копируемый при создании контекста конструктором по умолчанию. Например, вызов locale::global() не влияет на объекты локальных контекстов, хранящиеся в объектах потоков данных. Если вы хотите, чтобы существующий поток данных использовал конкретный локальный контекст, свяжите его с этим контекстом при помощи функции imbue().

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

Глобальная регистрация объекта локального контекста для потоков

std: ;cin.inibue(std: std::cout.imbue(std std:;cerr.1mbue(std

localeO);

:locale()):

:localeC)):

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

Фацеты

На функциональном уровне локальный контекст делится на несколько специальных объектов. Объект, обеспечивающий работу некоторого аспекта интернационализации, называется фацетом. Это означает, что объект локального контекста может рассматриваться как контейнер для различных фацетов. Для обращения к некоторому аспекту локального контекста тип соответствующего фацета передается в аргументе шаблонной функции use facet(). Например, следующее выражение обращается к фацету типа numpunct для типа символов char объекта локального контекста 1ос:

std: :usG facet<std-. :numpunct<char> >С1ос)

Каждый тип фацета определяется в виде класса, предоставляющего определенные сервисы. Например, тип фацета numpunct предоставляет сервис форматирования числовых и логических величин. Так, следующее выражение возвращает строку, используемую для представления true в локальном контексте 1ос;

std::use facet<std::numpunct<char> >С1ос).truenameO



В табл. 14.3 приведена сводка фацетов, поддерживаемых стандартной библиотекой С++. Фацеты делятся на категории, используемые некоторыми конструкторами для создания новых объектов локальных контекстов на основании комбинации других объектов.

Теблица 14.3. Типы фацетов, определенные в стандартной библиотеке С++

Категория

Тип фацета

Использование

numeric

num get<>0

Ввод числовых данных

numj3ut<>()

Вывод числовых данных

numpunctoQ

Символы, используемые при числовом вводе-выводе

time

timejetoO

Ввод даты и времени

timej3ut< >()

Вывод даты и времени

monetary

money get<>()

Ввод денежных величин

moneyj3ut<>()

Вывод денежных величин

moneypunctoQ

Символы, используемые при вводе-выводе денежных величин

ctype

ctypeoQ

Информация 0 символах (toupper(), isupper())

codecvt<>()

Преобразование между кодировками

collate

collateoO

Контекстное сравнение строк

messages

messagesoQ

Чтение строковых сообщений

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

class germanBoolNames : public std::numpunct byname<char> { public:

germanBoolNames (const char *name) : std; :nurnpunct byname<char>(name) [

protected:

virtual std::string do truename () const { return "wahr";

virtual std:;string do falsename () const { return "falsch";

Класс germanBoolNames объявлен производным от класса numpunct byname, определенного в стандартной библиотеке С++. Этот класс определяет параметры локального контекста, применяемые при числовом форматировании. Использование базового класса numpunct bynamQ вместо numpunct позволяет модифицировать функции класса, которые не переопределяются явным образом. Значения,



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