Classe num_put

Um modelo de classe que descreve um objeto que pode servir como uma faceta de localidade para controlar conversões de valores numéricos em sequências do tipo CharType.

Sintaxe

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

Parâmetros

CharType
O tipo usado em um programa para codificar caracteres em uma localidade.

OutputIterator
O tipo de iterador para o qual as funções put numéricas gravam sua saída.

Comentários

Como qualquer faceta de localidade, a ID de objeto estático tem um valor armazenado inicial de zero. A primeira tentativa de acessar seu valor armazenado armazena um valor positivo exclusivo na id.

Construtores

Construtor Descrição
num_put O construtor para objetos do tipo num_put.

Typedefs

Nome do tipo Descrição
char_type Um tipo que é usado para descrever um caractere usado por uma localidade.
iter_type Um tipo que descreve um iterador de saída.

Funções de membro

Função de membro Descrição
do_put Uma função virtual que é chamada para converter um número em uma sequência de CharTypes que representa o número formatado para uma determinada localidade.
put Converte um número em uma sequência de CharTypes que representa o número formatado para uma determinada localidade.

Requisitos

Cabeçalho:<locale>

Namespace: std

num_put::char_type

Um tipo que é usado para descrever um caractere usado por uma localidade.

typedef CharType char_type;

Comentários

O tipo é um sinônimo do parâmetro de modeloCharType.

num_put::d o_put

Uma função virtual que é chamada para converter um número em uma sequência de CharTypes que representa o número formatado para uma determinada localidade.

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;

Parâmetros

avançar
Um iterador que trata o primeiro elemento na cadeia de caracteres inserida.

_Iosbase
Foi especificado o fluxo que contém a localidade com a faceta numpunct usada para pontuar a saída e os sinalizadores para a formatação da saída.

_Fill
Um caractere que é usado para espaçamento.

val
O número ou tipo booliano que será a saída.

Valor de retorno

Um iterador de saída que aborda uma posição além do último elemento produzido.

Comentários

A primeira função membro protegida virtual gera elementos sequenciais começando em next para produzir um campo de saída inteiro com o valor de val. A função retorna um iterador designando o próximo local para inserir um elemento além do campo de saída inteiro gerado.

O campo de saída inteiro é gerado pelas mesmas regras usadas pelas funções de impressão para gerar uma série de elementos char para um arquivo. Cada elemento char é considerado mapeado para um elemento equivalente do tipo CharType por um mapeamento um para um simples. Quando uma função de impressão preenche um campo com espaços ou o dígito 0, no entanto, do_put usa fill. A especificação de conversão de impressão equivalente é determinada da seguinte forma:

  • Se iosbase. bandeiras & ios_base::basefield == ios_base::oct, a especificação de conversão é .lo

  • Se iosbase.flags & ios_base::basefield == ios_base::hexadecimal, a especificação de conversão é .lx

  • Caso contrário, a especificação de conversão é ld.

Se iosbase. width é diferente de zero, uma largura de campo deste valor é anexado. Em seguida, a função chama iosbase. width(0) para redefinir a largura do campo como zero.

O preenchimento ocorre apenas se o número mínimo de elementos N necessários para especificar o campo de saída for menor que iosbase. width. Esse preenchimento consiste em uma sequência de N - width cópias de fill. O preenchimento ocorre então da seguinte maneira:

  • Se iosbase. bandeiras e ios_base::adjustfield == ios_base::à esquerda, a bandeira - é prefixada. (O preenchimento ocorre após o texto gerado.)

  • Se iosbase.flags & ios_base::adjustfieldios_base:: == internal, o sinalizador 0 será anexado. (Para um campo de saída numérico, o preenchimento ocorre quando as funções de impressão são preenchidas com 0.)

  • Caso contrário, nenhum sinalizador adicional é anexado. (O preenchimento ocorre antes da sequência gerada.)

Por fim:

  • Se iosbase. flags & ios_base::showpos é diferente de zero, o sinalizador + é anexado à especificação de conversão.

  • Se iosbase. flags & ios_base::showbase é diferente de zero, o sinalizador # é anexado à especificação de conversão.

O formato de um campo de saída inteiro é determinado ainda pelo locale facetfac retornado pela chamada use_facet<numpunct<Elem>(iosbase.getloc). Especificamente:

  • fac. grouping determina como os dígitos são agrupados à esquerda da vírgula decimal

  • fac. thousands_sep determina a sequência que separa grupos de dígitos à esquerda da vírgula decimal

Se nenhuma restrição de agrupamento for imposta por fac. grouping (o primeiro elemento tem o valor CHAR_MAX), então não há instâncias de fac. thousands_sep são gerados no campo de saída. Caso contrário, os separadores são inseridos após a conversão de impressão.

A segunda função membro virtual protegida:

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

comporta-se da mesma maneira que a primeira, exceto que substitui uma especificação de conversão de ld por lu.

A terceira função membro virtual protegida:

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

comporta-se da mesma maneira que a primeira, exceto que gera um campo de saída de ponto flutuante do valor de val. fac. decimal_point determina a sequência que separa os dígitos de inteiros dos dígitos de fração. A especificação de conversão de impressão equivalente é determinada da seguinte forma:

  • Se iosbase. bandeiras e ios_base::floatfield == ios_base::fixo, a especificação de conversão é .lf

  • Se iosbase. Bandeiras & ios_base::Floatfield == ios_base::Scientific, a especificação de conversão é .le Se iosbase. bandeiras e ios_base::maiúsculas são diferentes de zero, e é substituído por E.

  • Caso contrário, a especificação de conversão é Ig. Se iosbase. flags & ios_base::maiúsculas é diferente de zero, g é substituído por G.

Se iosbase. flags & ios_base::fixed é diferente de zero ou se iosbase. precision é maior que zero, uma precisão com o valor iosbase. precision é anexado à especificação de conversão. O preenchimento comporta-se da mesma maneira que um campo de saída inteiro. O caractere de preenchimento é fill. Por fim:

  • Se iosbase. flags & ios_base::showpos é diferente de zero, o sinalizador + é anexado à especificação de conversão.

  • Se iosbase. flags & ios_base::showpoint é diferente de zero, o sinalizador # é anexado à especificação de conversão.

A quarta função membro virtual protegida:

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

se comporta como o terceiro, exceto que o qualificador l na especificação de conversão é substituído por L.

A quinta função membro virtual protegida:

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

se comporta como o primeiro, exceto que a especificação de conversão é p, mais qualquer qualificador necessário para especificar o preenchimento.

A sexta função membro virtual protegida:

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

comporta-se da mesma maneira que a primeira, exceto que gera um campo de saída booliano de val.

Um campo de saída booliano adota um de dois formatos. Se iosbase.flags & ios_base::boolalpha for false, a função membro retornará do_put(_Next, _Iosbase, _Fill, (long)val), o que normalmente produz uma sequência gerada de 0 (para false) ou 1 (para true). Caso contrário, a sequência gerada será fac.falsename (para false), ou fac. truename (para true).

A sétima função membro virtual protegida:

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

comporta-se da mesma maneira que a primeira, exceto que substitui uma especificação de conversão de ld por lld.

A oitava função membro virtual protegida:

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

comporta-se da mesma maneira que a primeira, exceto que substitui uma especificação de conversão de ld por llu.

Exemplo

Consulte o exemplo de put, que chama do_put.

num_put::iter_type

Um tipo que descreve um iterador de saída.

typedef OutputIterator iter_type;

Comentários

O tipo é um sinônimo do parâmetro de modelo OutputIterator.

num_put::num_put

O construtor para objetos do tipo num_put.

explicit num_put(size_t _Refs = 0);

Parâmetros

_Refs
Valor inteiro usado para especificar o tipo de gerenciamento de memória do objeto.

Comentários

Os valores possíveis para o parâmetro _Refs e sua significância são:

  • 0: o tempo de vida do objeto é gerenciado pelas localidades que o contêm.

  • 1: o tempo de vida do objeto deve ser gerenciado manualmente.

  • > 1: esses valores não estão definidos.

Nenhum exemplo direto é possível, pois o destruidor está protegido.

O construtor inicializa seu objeto base com locale::facet(_ Refs).

num_put::p ut

Converte um número em uma sequência de CharTypes que representa o número formatado para uma determinada localidade.

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;

Parâmetros

dest
Um iterador que trata o primeiro elemento na cadeia de caracteres inserida.

_Iosbase
Foi especificado o fluxo que contém a localidade com a faceta numpunct usada para pontuar a saída e os sinalizadores para a formatação da saída.

_Fill
Um caractere que é usado para espaçamento.

val
O número ou tipo booliano que será a saída.

Valor de retorno

Um iterador de saída que aborda uma posição além do último elemento produzido.

Comentários

Todas as funções membro retornam do_put( next, _Iosbase, _Fill, val).

Exemplo

// 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

Confira também

<locale>
Classe facet
Acesso Thread-Safe na Biblioteca Padrão C++