Программирование >>  Операторы преобразования типа 

1 ... 215 216 217 [ 218 ] 219 220 221 ... 239


В табл. 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 позволяет модифицировать функции класса, которые не переопределяются явным образом. Значения,



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

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

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

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

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 locales 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 string<charT.Traits.Allocator>& si. const basic string<charT.Traits.Allocator>& s2) const;

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

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

bool has facet (const locale&) throwO:

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



1 ... 215 216 217 [ 218 ] 219 220 221 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика