Поделиться через


Класс num_put

Шаблон класса, описывающий объект, который может служить аспектом языкового стандарта для управления преобразованиями числовых значений в последовательности типов CharType.

Синтаксис

template <class CharType,
    class OutputIterator = ostreambuf_iterator<CharType>>
class num_put : public locale::facet;

Параметры

CharType
Тип, используемый внутри программы для кодирования символов в языковом стандарте.

OutputIterator
Тип итератора, куда численные функции записывают свои выходные данные.

Замечания

Как и в случае любого другого аспекта языкового стандарта, начальное сохраненное значение статического идентификатора объекта равно нулю. Первая попытка получить доступ к сохраненному значению сохранит уникальное положительное значение в id.

Конструкторы

Конструктор Description
num_put Конструктор для объектов типа num_put.

Определения типов

Введите имя Description
char_type Тип, используемый для описания символа, используемого языковым стандартом.
iter_type Тип, который описывает итератор вывода.

Функции элементов

Функция-член Description
do_put Виртуальная функция, которая вызывается для преобразования числа в последовательность CharType, представляющую это число в формате для определенного языкового стандарта.
put Преобразует число в последовательность CharType, представляющую число в формате для определенного языкового стандарта.

Требования

Заголовок:<языковой стандарт>

Пространство имен: std

num_put::char_type

Тип, используемый для описания символа, используемого языковым стандартом.

typedef CharType char_type;

Замечания

Этот тип является синонимом для параметра шаблона CharType.

num_put::d o_put

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

virtual iter_type do_put(
    iter_type dest,
    ios_base& _Iosbase,
    _Elem _Fill,
    bool val) const;

virtual iter_type do_put(
    iter_type dest,
    ios_base& _Iosbase,
    _Elem _Fill,
    long val) const;

virtual iter_type do_put(
    iter_type dest,
    ios_base& _Iosbase,
    _Elem _Fill,
    unsigned long val) const;

virtual iter_type do_put(
    iter_type dest,
    ios_base& _Iosbase,
    _Elem _Fill,
    double val) const;

virtual iter_type do_put(
    iter_type dest,
    ios_base& _Iosbase,
    _Elem _Fill,
    long double val) const;

virtual iter_type do_put(
    iter_type dest,
    ios_base& _Iosbase,
    _Elem _Fill,
    const void* val) const;

virtual iter_type do_put(
    iter_type dest,
    ios_base& _Iosbase,
    _Elem _Fill,
    const long long val) const;

virtual iter_type do_put(
    iter_type dest,
    ios_base& _Iosbase,
    _Elem _Fill,
    const unsigned long long val) const;

Параметры

next
Итератор, адресующий первый элемент во вставляемой строке.

_Iosbase
Указывает поток, который содержит языковой стандарт с аспектом numpunct, используемым для расстановки знаков препинания в выводе, и флагами для форматирования вывода.

_Заполнять
Символ, используемый для расстановки интервалов.

Val
Числовой или логический тип для возвращаемого значения.

Возвращаемое значение

Итератор вывода, который адресует позицию после последнего сформированного элемента.

Замечания

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

Целочисленное поле вывода формируется теми же правилами, которые используются функциями печати для выдачи рядов элементов char в файл. Предполагается, что каждый такой элемент char сопоставляется с эквивалентным элементом типа CharType простым сопоставлением "один к одному". Если функция печати заполняет поле с пробелами или цифрой 0, do_put но вместо этого используется fill. Эквивалентная спецификация преобразования печати определяется следующим образом:

  • Если iosbase. флаги и ios_base::basefield == ios_base::окт, спецификация преобразования имеет значение .lo

  • Если iosbase.flags & ios_base::basefieldios_base:: == hex, спецификация преобразования — lxэто .

  • В противном случае спецификация преобразования имеет значение ld.

Если iosbase. width не равно нулю, ширина поля этого значения добавляется в начало. Затем функция вызывает iosbase. width(0) для сброса ширины поля в нуль.

Заполнение происходит, только если минимальное количество элементов N, требуемое для указания поля вывода, меньше, чем iosbase. width. Такое заполнение состоит из последовательности N-ширины - копии заливки. Заполнение выполняется следующим образом:

  • Если iosbase. флаги и ios_base::adjustfield == ios_base::слева, флаг - предопределен. (Заполнение происходит после сформированного текста.)

  • Если iosbase.flags & ios_base::adjustfieldios_base:: == internal, флаг 0 предустановлен. (Для числового поля вывода заполнение происходит там, где функции печати заполняют цифрой 0.)

  • В противном случае никакие дополнительные флаги в начало не добавляются. (Заполнение происходит перед сформированной последовательностью.)

Как итог:

  • Если iosbase. флаги и ios_base::showpos ненулевое значение, флаг + добавляется в спецификацию преобразования.

  • Если iosbase. флаги и ios_base::showbase ненулевое значение, флаг # добавляется в спецификацию преобразования.

Формат целочисленного поля выходных данных определяется дополнительным аспектом языкового стандарта, возвращаемым вызовом use_facet<numpunct<Elem>(iosbase). getloc). В частности:

  • fac. grouping определяет, как будут группироваться цифры слева от любого десятичного разделителя;

  • fac. thousands_sep определяет последовательность, которая разделяет группы цифр слева от любого десятичного разделителя.

Если не накладываются ограничения по группированию со стороны fac. grouping (первый элемент имеет значение CHAR_MAX), то никакие экземпляры fac. thousands_sep не будут формироваться в поле вывода. В противном случае после преобразования печати будут вставлены разделители.

Вторая виртуальная защищенная функция-член:

virtual iter_type do_put(iter_type next,
    ios_base& _Iosbase,
    CharType _Fill,
    unsigned long val) const;

ведет себя так же, как первая, за исключением того, что она заменяет спецификацию преобразования ld на lu.

Третья виртуальная защищенная функция-член:

virtual iter_type do_put(iter_type next,
    ios_base& _Iosbase,
    CharType _Fill,
    double val) const;

ведет себя так же, как первая, за исключением того, что она создает поле вывода с плавающей запятой из значения val. fac. decimal_point определяет последовательность, которая отделяет цифры целой части от цифр дробной части. Эквивалентная спецификация преобразования печати определяется следующим образом:

  • Если iosbase. флаги и ios_base::floatfieldios_base:: == исправлены, спецификация преобразования имеет значение .lf

  • Если iosbase. флаги и ios_base::floatfieldios_base:: == scientific, спецификация преобразования имеет значение .le Если iosbase. флаги и ios_base::верхний регистр ненулево, e заменяются Eна .

  • В противном случае спецификация преобразования будет иметь значение lg. Если iosbase. флаги и ios_base::прописные буквы ненулевое, g заменяются Gна .

Если iosbase. flags & ios_base::fixed ненулево или если iosbase. precision больше нуля, точность со значением iosbase. precision добавляется в начало спецификации преобразования. Любое заполнение происходит так же, как для целочисленного поля вывода. Символ заполнения — fill. Как итог:

  • Если iosbase. флаги и ios_base::showpos ненулевое значение, флаг + добавляется в спецификацию преобразования.

  • Если iosbase. флаги и ios_base::showpoint являются ненулевой, флаг # предустановлен в спецификацию преобразования.

Четвертая виртуальная защищенная функция-член:

virtual iter_type do_put(iter_type next,
    ios_base& _Iosbase,
    CharType _Fill,
    long double val) const;

выполняет то же самое третье, за исключением того, что квалификатор l в спецификации преобразования заменяется Lна .

Пятая виртуальная защищенная функция-член:

virtual iter_type do_put(iter_type next,
    ios_base& _Iosbase,
    CharType _Fill,
    const void* val) const;

ведет себя так же, как первая, за исключением того, что спецификация преобразования — p, плюс любые квалификаторы, необходимые для указания заполнения.

Шестая виртуальная защищенная функция-член:

virtual iter_type do_put(iter_type next,
    ios_base& _Iosbase,
    CharType _Fill,
    bool val) const;

ведет себя так же, как и первый, за исключением того, что он создает логическое поле выходных данных из val.

Логическое поле вывода принимает одну из двух форм. Если iosbase.flags & ios_base::логическое значение равно false, функция-член возвращается do_put(_Next, _Iosbase, _Fill, (long)val), которая обычно создает созданную последовательность 0 (для false) или 1 (для true). В противном случае созданная последовательность имеет значение fac.falsename (for false), или fac.truename (for true).

Седьмая виртуальная защищенная функция-член:

virtual iter_type do_put(iter_type next,
    ios_base& iosbase,
    Elem fill,
    long long val) const;

ведет себя так же, как первая, за исключением того, что она заменяет спецификацию преобразования ld на lld.

Восьмая виртуальная защищенная функция-член:

virtual iter_type do_put(iter_type next,
    ios_base& iosbase,
    Elem fill,
    unsigned long long val) const;

ведет себя так же, как первая, за исключением того, что она заменяет спецификацию преобразования ld на llu.

Пример

См. пример для put, который вызывает do_put.

num_put::iter_type

Тип, который описывает итератор вывода.

typedef OutputIterator iter_type;

Замечания

Тип является синонимом параметра-шаблона OutputIterator.

num_put::num_put

Конструктор для объектов типа num_put.

explicit num_put(size_t _Refs = 0);

Параметры

_Refs
Целочисленное значение, используемое для указания типа управления памятью для объекта.

Замечания

Возможные значения параметра _Refs и их значение:

  • 0: время существования объекта управляется языковыми стандартами, которые его содержат.

  • 1: время существования объекта должно управляться вручную.

  • > 1. Эти значения не определены.

Прямые примеры привести нельзя, так как деструктор защищен.

Конструктор инициализирует свой базовый объект через locale::facet(_ Refs).

num_put::p ut

Преобразует число в последовательность CharTypes, представляющую число, отформатированный для заданного языкового стандарта.

iter_type put(
    iter_type dest,
    ios_base& _Iosbase,
    _Elem _Fill,
    bool val) const;

iter_type put(
    iter_type dest,
    ios_base& _Iosbase,
    _Elem _Fill,
    long val) const;

iter_type put(
    iter_type dest,
    ios_base& _Iosbase,
    _Elem _Fill,
    unsigned long val) const;

iter_type put(
    iter_type dest,
    ios_base& _Iosbase,
    _Elem _Fill,
    Long long val) const;

iter_type put(
    iter_type dest,
    ios_base& _Iosbase,
    _Elem _Fill,
    Unsigned long long val) const;

iter_type put(
    iter_type dest,
    ios_base& _Iosbase,
    _Elem _Fill,
    double val) const;

iter_type put(
    iter_type dest,
    ios_base& _Iosbase,
    _Elem _Fill,
    long double val) const;

iter_type put(
    iter_type dest,
    ios_base& _Iosbase,
    _Elem _Fill,
    const void* val) const;

Параметры

dest
Итератор, адресующий первый элемент во вставляемой строке.

_Iosbase
Указывает поток, который содержит языковой стандарт с аспектом numpunct, используемым для расстановки знаков препинания вывода и флагами для форматирования вывода.

_Заполнять
Символ, используемый для расстановки интервалов.

Val
Числовой или логический тип для возвращаемого значения.

Возвращаемое значение

Итератор вывода, который адресует позицию после последнего сформированного элемента.

Замечания

Все функции-члены возвращают do_put(next, _Iosbase, _Fill, val).

Пример

// num_put_put.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
#include <sstream>
using namespace std;
int main( )
{
   locale loc( "german_germany" );
   basic_stringstream<char> psz2;
   ios_base::iostate st = 0;
   long double fVal;
   cout << "The thousands separator is: "
        << use_facet < numpunct <char> >(loc).thousands_sep( )
        << endl;

   psz2.imbue( loc );
   use_facet < num_put < char > >
      ( loc ).put(basic_ostream<char>::_Iter(psz2.rdbuf( ) ),
                    psz2, ' ', fVal=1000.67);

   if ( st & ios_base::failbit )
      cout << "num_put( ) FAILED" << endl;
   else
      cout << "num_put( ) = " << psz2.rdbuf( )->str( ) << endl;
}
The thousands separator is: .
num_put( ) = 1.000,67

См. также

<локаль>
Класс facet
Потокобезопасность в стандартной библиотеке C++