Книга: Эффективное использование STL
Локальные контексты в C++
Локальные контексты в C++
В стандартной библиотеке C++ локальный контекст не является глобальной структурой данных, запрятанной где-то в недрах реализации библиотеки. Это объект типа std::locale
, который можно создать и передать его другой функции, как любой другой объект. Пример создания объекта для стандартного локального контекста:
std::locale L = std::locale::classic();
Локальный контекст немецкого языка создается командой
std::locale L("de");
Имена локальных контекстов, как и в библиотеке C, не стандартизованы. Список имен локальных контекстов, доступных в вашей реализации, следует искать в документации.
Локальные контексты C++ делятся на фасеты (facets
), связанные с разными аспектами интернационализации. Для извлечения заданного фасета из объекта локального контекста используется функция std::use_facet
[6]. Фасет ctype
отвечает за классификацию символов, в том числе и преобразования типа. Если c1
и c2
относятся к типу char
, следующий фрагмент сравнивает их без учета регистра по правилам локального контекста L
.
const std::ctype<char>& ct = std::use_facet<std::ctype<char> >(L);
bool result = ct.toupper(c1) < ct.toupper(c2);
Предусмотрена особая сокращенная запись: std::toupper(c, L)
, эквивалентная
std::use_facet<std::ctype<char> >(L).toupper(c)
Использование use_facet
стоит свести к минимуму, поскольку оно связано с заметными затратами.
По аналогии с тем, как лексикографическое сравнение оказывается неподходящим в некоторых ситуациях, преобразования символов «один-в-один» тоже годятся не всегда (например, в немецком языке символ (? нижнего регистра соответствует последовательности «SS» в верхнем регистре). К сожалению, средства преобразования регистра в стандартных библиотеках С и C++ работают только с отдельными символами. Если это ограничение вас не устраивает, решение со стандартными библиотеками отпадает.
- 10.4. Локальные сети
- Сравнение C# и C++
- IBPP для разработки C++
- Subscribing to C++ In Action
- Table B-1. Support for Java, C, and C++ programming
- 12.5. Нелокальные переходы
- SEH и обработка исключений в C++
- Локальные области хранения потоков
- Локальные политики
- Ваши личные контексты
- 22.7. Локальные группы пользователей Ruby
- ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ