Namespaces
Variants

std::num_put<CharT,OutputIt>:: put, std::num_put<CharT,OutputIt>:: do_put

From cppreference.net
std::num_put
Member functions
num_put::put num_put::do_put
(Anmerkung: Der bereitgestellte HTML-Code enthält keinen übersetzbaren Text, da alle Tags leer sind. Die HTML-Struktur wurde gemäß den Anforderungen unverändert beibehalten.)
Definiert im Header <locale>
(1)
public :

iter_type put ( iter_type out, std:: ios_base & str,

char_type fill, bool val ) const ;
iter_type put ( iter_type out, std:: ios_base & str,
char_type fill, long val ) const ;
iter_type put ( iter_type out, std:: ios_base & str,
char_type fill, long long val ) const ;
(seit C++11)
iter_type put ( iter_type out, std:: ios_base & str,
char_type fill, unsigned long val ) const ;
iter_type put ( iter_type out, std:: ios_base & str,
char_type fill, unsigned long long val ) const ;
(seit C++11)
iter_type put ( iter_type out, std:: ios_base & str,
char_type fill, double val ) const ;
iter_type put ( iter_type out, std:: ios_base & str,
char_type fill, long double val ) const ;
iter_type put ( iter_type out, std:: ios_base & str,
char_type fill, const void * val ) const ;
(2)
protected :

virtual iter_type do_put ( iter_type out, std:: ios_base & str,

char_type fill, bool val ) const ;
virtual iter_type do_put ( iter_type out, std:: ios_base & str,
char_type fill, long val ) const ;
virtual iter_type do_put ( iter_type out, std:: ios_base & str,
char_type fill, long long val ) const ;
(seit C++11)
virtual iter_type do_put ( iter_type out, std:: ios_base & str,
char_type fill, unsigned long val ) const ;
virtual iter_type do_put ( iter_type out, std:: ios_base & str,
char_type fill, unsigned long long val ) const ;
(seit C++11)
virtual iter_type do_put ( iter_type out, std:: ios_base & str,
char_type fill, double val ) const ;
virtual iter_type do_put ( iter_type out, std:: ios_base & str,
char_type fill, long double val ) const ;
virtual iter_type do_put ( iter_type out, std:: ios_base & str,
char_type fill, const void * val ) const ;
1) Öffentliche Memberfunktion, ruft die geschützte virtuelle Memberfunktion do_put der am meisten abgeleiteten Klasse auf.
2) Schreibt Zeichen in die Ausgabesequenz out , die den Wert von val repräsentieren, formatiert gemäß den Formatierungsflags str. flags ( ) sowie den std::numpunct - und std::ctype -Facetten des im Stream str eingebetteten Locales. Diese Funktion wird von allen formatierten Ausgabestream-Operatoren aufgerufen, wie z.B. std:: cout << n ; .

Die Konvertierung erfolgt in vier Stufen:

Inhaltsverzeichnis

Stufe 1: Auswahl des Konvertierungsspezifizierers

  • I/O-Format-Flags werden abgerufen, als ob durch
fmtflags basefield = ( str. flags ( ) & std:: ios_base :: basefield ) ;
fmtflags uppercase = ( str. flags ( ) & std:: ios_base :: uppercase ) ;
fmtflags floatfield = ( str. flags ( ) & std:: ios_base :: floatfield ) ;
fmtflags showpos = ( str. flags ( ) & std:: ios_base :: showpos ) ;
fmtflags showbase = ( str. flags ( ) & std:: ios_base :: showbase ) ;
fmtflags showpoint = ( str. flags ( ) & std:: ios_base :: showpoint ) ;
**Anmerkung:** Da es sich bei dem gesamten Inhalt um C++-Code innerhalb von ` ` Tags handelt, wurde gemäß den Anweisungen kein Text übersetzt. Der Code bleibt vollständig in der Originalsprache erhalten.
  • Wenn der Typ von val bool ist:
    • Wenn boolalpha == 0 , dann wird val in den Typ int konvertiert und Integer-Ausgabe durchgeführt.
    • Wenn boolalpha ! = 0 , wird std:: use_facet < std:: numpunct < CharT >> ( str. getloc ( ) ) . truename ( ) abgerufen, falls val == true , oder std:: use_facet < std:: numpunct < CharT >> ( str. getloc ( ) ) . falsename ( ) falls val == false , und jedes aufeinanderfolgende Zeichen c dieser Zeichenkette wird mit * out ++ = c an out ausgegeben. In diesem Fall erfolgt keine weitere Verarbeitung, die Funktion gibt out zurück.
  • Wenn der Typ von val ein Integer-Typ ist, wird die erste zutreffende Option der folgenden ausgewählt:
    • Wenn basefield == oct , wird Konvertierungsspezifizierer % o verwendet.
    • Wenn basefield == hex && ! uppercase , wird Konvertierungsspezifizierer % x verwendet.
    • Wenn basefield == hex , wird Konvertierungsspezifizierer % X verwendet.
    • Wenn der Typ von val vorzeichenbehaftet ist, wird Konvertierungsspezifizierer % d verwendet.
    • Wenn der Typ von val vorzeichenlos ist, wird Konvertierungsspezifizierer % u verwendet.
  • Für Integer-Typen wird bei Bedarf ein Längenmodifikator zur Konvertierungsspezifikation hinzugefügt: l für long und unsigned long , ll für long long und unsigned long long (seit C++11) .
  • Wenn der Typ von val ein Gleitkommatyp ist, wird die erste zutreffende Option der folgenden ausgewählt:
(bis C++11)
(seit C++11)
(seit C++11)
  • Falls ! uppercase , wird der Konvertierungsspezifizierer % g verwendet.
  • Andernfalls wird der Konvertierungsspezifizierer % G verwendet.
Außerdem:
  • Wenn der Typ von val long double ist, wird die Längenangabe L zum Konvertierungsspezifizierer hinzugefügt.
  • Wenn der Typ von val ein Gleitkommatyp ist und floatfield ! = ( ios_base :: fixed | ios_base :: scientific ) (seit C++11) , wird die Genauigkeitsangabe hinzugefügt und auf str. precision ( ) gesetzt. Andernfalls wird keine Genauigkeit angegeben.
  • Für sowohl Ganzzahl- als auch Gleitkommatypen wird, wenn showpos gesetzt ist, das Modifikatorzeichen + vorangestellt.
  • Für Ganzzahltypen wird, wenn showbase gesetzt ist, das Modifikatorzeichen # vorangestellt.
  • Für Gleitkommatypen wird, wenn showpoint gesetzt ist, das Modifikatorzeichen # vorangestellt.
  • Wenn der Typ von val void * ist, wird der Konvertierungsspezifizierer % p verwendet.
  • Eine Zeichenkette in schmaler Zeichenkodierung wird erstellt, als ob durch einen Aufruf von std:: printf ( spec, val ) im "C"-Locale, wobei spec der gewählte Konvertierungsspezifizierer ist.

Stufe 2: Locale-spezifische Konvertierung

Stufe 3: Padding

  • Das Anpassungsflag wird erhalten, als ob durch std :: fmtflags adjustfield = ( flags & ( std:: ios_base :: adjustfield ) ) und wird untersucht, um die Auffüllposition zu identifizieren, wie folgt:
  • Wenn str. width ( ) ungleich Null ist (z.B. wurde gerade std::setw verwendet) und die Anzahl der CharT nach Stufe 2 kleiner ist als str. width ( ) , dann werden Kopien des fill -Zeichens an der durch die Auffüllung angegebenen Position eingefügt, um die Länge der Sequenz auf str. width ( ) zu bringen.

In jedem Fall wird str. width ( 0 ) aufgerufen, um die Effekte von std::setw aufzuheben.

Stufe 4: Ausgabe

Jeder aufeinanderfolgende Zeichen c aus der Sequenz von CharT 's aus Stufe 3 wird ausgegeben, als ob durch * out ++ = c .

Parameter

out - Iterator, der auf das erste zu überschreibende Zeichen zeigt
str - Stream, von dem die Formatierungsinformationen abgerufen werden
fill - Füllzeichen, das verwendet wird, wenn die Ergebnisse auf die Feldbreite aufgefüllt werden müssen
val - Wert, der in eine Zeichenkette umgewandelt und ausgegeben werden soll

Rückgabewert

out

Hinweise

Die führende Null, die durch die Konvertierungsspezifikation #o (resultierend aus der Kombination von std::showbase und std::oct zum Beispiel) erzeugt wird, zählt nicht als Auffüllzeichen.

Beim Formatieren eines Gleitkommawerts als Hexadezimalzahl (d.h. wenn floatfield == ( std:: ios_base :: fixed | std:: ios_base :: scientific ) ), wird die Präzision des Streams nicht verwendet; stattdessen wird die Zahl immer mit ausreichender Präzision ausgegeben, um den Wert exakt darzustellen.

(since C++11)

Beispiel

Geben Sie eine Zahl direkt über die Facette aus und demonstrieren Sie eine benutzerdefinierte Facette:

#include <iostream>
#include <locale>
// this custom num_put outputs squares of all integers (except long long)
struct squaring_num_put : std::num_put<char>
{
    iter_type do_put(iter_type out, std::ios_base& str,
                     char_type fill, long val) const
    {
        return std::num_put<char>::do_put(out, str, fill, val * val);
    }
    iter_type do_put(iter_type out, std::ios_base& str,
                     char_type fill, unsigned long val) const
    {
        return std::num_put<char>::do_put(out, str, fill, val * val);
    }
};
int main()
{
    auto& facet = std::use_facet<std::num_put<char>>(std::locale());
    facet.put(std::cout, std::cout, '0', 2.71);
    std::cout << '\n';
    std::cout.imbue(std::locale(std::cout.getloc(), new squaring_num_put));
    std::cout << 6 << ' ' << -12 << '\n';
}

Ausgabe:

2.71
36 144

Eine Implementierung von operator<< für einen benutzerdefinierten Typ.

#include <iostream>
#include <iterator>
#include <locale>
struct base { long x = 10; };
template<class CharT, class Traits>
std::basic_ostream<CharT, Traits>&
    operator<<(std::basic_ostream<CharT, Traits>& os, const base& b)
{
    try
    {
        typename std::basic_ostream<CharT, Traits>::sentry s(os);
        if (s)
        {
            std::ostreambuf_iterator<CharT, Traits> it(os);
            std::use_facet<std::num_put<CharT>>(os.getloc())
                .put(it, os, os.fill(), b.x);
        }
    }
    catch (...)
    {
        // set badbit on os and rethrow if required
    }
    return os;
}
int main()
{
    base b;
    std::cout << b;
}

Ausgabe:

10

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 34 C++98 die bool Überladung verwendete nicht existierende Member
truename und falsename von std::ctype
verwende diese Member
von std::numpunct
LWG 231 C++98 der Präzisionsmodifikator wurde nur hinzugefügt wenn
( flags & fixed ) ! = 0 oder str. precision ( ) > 0
entfernte diese Bedingungen
LWG 282 C++98 die Tausendertrennzeichen wurden nur
für integrale Typen in Stufe 2 eingefügt
auch eingefügt für
Gleitkommatypen
LWG 4084 C++11 "NAN" und "INF" konnten nicht ausgegeben werden sie können ausgegeben werden

Siehe auch

Fügt formatierte Daten ein
(öffentliche Elementfunktion von std::basic_ostream<CharT,Traits> )