std::num_put<CharT,OutputIt>:: put, std::num_put<CharT,OutputIt>:: do_put
|
Definiert im Header
<locale>
|
||
| (1) | ||
|
public
:
iter_type put
(
iter_type out,
std::
ios_base
&
str,
|
||
|
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,
|
||
|
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 ; |
||
do_put
der am meisten abgeleiteten Klasse auf.
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 ) ;
-
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) |
-
- Wenn floatfield == std:: ios_base :: scientific && ! uppercase , wird der Konvertierungsspezifizierer % e verwendet.
- Wenn floatfield == std:: ios_base :: scientific , wird der Konvertierungsspezifizierer % E verwendet.
|
(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
-
Jedes Zeichen
c
aus Stufe 1, außer dem Dezimalpunkt
'.'
, wird durch Aufruf von
std::
use_facet
<
std::
ctype
<
CharT
>>
(
str.
getloc
(
)
)
.
widen
(
c
)
in
CharTkonvertiert. - Für arithmetische Typen wird das Tausendertrennzeichen, ermittelt aus std:: use_facet < std:: numpunct < CharT >> ( str. getloc ( ) ) . thousands_sep ( ) , gemäß den Gruppierungsregeln von std:: use_facet < std:: numpunct < CharT >> ( str. getloc ( ) ) . grouping ( ) in die Sequenz eingefügt.
- Dezimalpunkt-Zeichen ( '.' ) werden durch std:: use_facet < std:: numpunct < CharT >> ( str. getloc ( ) ) . decimal_point ( ) ersetzt.
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 adjustfield == std:: ios_base :: left , wird nachher aufgefüllt.
- Wenn adjustfield == std:: ios_base :: right , wird vorher aufgefüllt.
- Wenn adjustfield == std:: ios_base :: internal und ein Vorzeichen in der Darstellung vorkommt, wird nach dem Vorzeichen aufgefüllt.
- Wenn adjustfield == std:: ios_base :: internal und die Stufe-1-Darstellung mit 0x oder 0X begann, wird nach dem x oder X aufgefüllt.
- Andernfalls wird vorher aufgefüllt.
-
Wenn
str.
width
(
)
ungleich Null ist (z.B. wurde gerade
std::setw
verwendet) und die Anzahl der
CharTnach 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>
)
|