std::num_get
| Definiert in Header <locale> |
||
| template< class CharT, |
||
Die Klasse std::num_get kapselt die Regeln für das Parsen von String-Repräsentationen numerischer Werte. Insbesondere werden die Typen bool, unsigned short, unsigned int, long, unsigned long, long long, unsigned long long(seit C++11), float, double, long double und void* unterstützt. Die Standard-Format-Eingabeoperatoren (wie z.B. cin >> n;) verwenden die std::num_get-Facet der Locale des I/O-Streams, um die Textdarstellungen von Zahlen zu parsen.
Vererbungdiagramm
Wenn keine Spezialisierung von std::num_get vom Standardbibliotheken bereitgestellt wird (siehe unten), sind die Verhaltensweisen ihrer get() und do_get() nicht wie spezifiziert garantiert.
Inhalt |
[bearbeiten] Spezialisierungen
Die Standardbibliothek garantiert die Bereitstellung der folgenden Spezialisierungen (sie müssen von jedem Locale-Objekt implementiert werden)
| Definiert in Header
<locale> | |
| std::num_get<char> | erstellt die Analyse von Zahlen aus schmalen Strings |
| std::num_get<wchar_t> | erstellt die Analyse von Zahlen aus breiten Strings |
Darüber hinaus ist garantiert, dass die Standardbibliothek jede Spezialisierung bereitstellt, die die folgenden Tybanforderungen erfüllt:
-
CharTist eines davon:- char,
- wchar_t, und
- jeder andere implementierungsdefinierte Zeichencontainertyp, der die Anforderungen an ein Zeichen erfüllt, auf dem eine der iostream-Komponenten instanziiert werden kann; und
-
InputItmuss die Anforderungen von LegacyInputIterator erfüllen.
[bearbeiten] Verschachtelte Typen
| Typ | Definition |
char_type
|
CharT
|
iter_type
|
InputIt
|
[edit] Datenmember
| Mitglied | Beschreibung |
std::locale::id id [static] |
die Kennung des Facets |
[bearbeiten] Memberfunktionen
konstruiert ein neues num_get-Facet(öffentliche Memberfunktion) | |
ruft do_get auf(öffentliche Memberfunktion) |
[bearbeiten] Geschützte Memberfunktionen
zerstört ein num_get-Facet(geschützte Memberfunktion) | |
| [virtuell] |
parst eine Zahl aus einem Eingabestream (virtuelle geschützte Memberfunktion) |
[bearbeiten] Beispiel
#include <iostream> #include <iterator> #include <locale> #include <sstream> #include <string> int main() { std::string de_double = "1.234.567,89"; std::string us_double = "1,234,567.89"; // parse using streams std::istringstream de_in(de_double); de_in.imbue(std::locale("de_DE.UTF-8")); double f1; de_in >> f1; std::istringstream us_in(de_double); us_in.imbue(std::locale("en_US.UTF-8")); double f2; us_in >> f2; std::cout << "Parsing " << de_double << " as double gives " << std::fixed << f1 << " in de_DE locale and " << f2 << " in en_US\n"; // use the facet directly std::istringstream s3(us_double); s3.imbue(std::locale("en_US.UTF-8")); auto& f = std::use_facet<std::num_get<char>>(s3.getloc()); std::istreambuf_iterator<char> beg(s3), end; double f3; std::ios::iostate err; f.get(beg, end, s3, err, f3); std::cout << "parsing " << us_double << " as double using raw en_US facet gives " << f3 << '\n'; }
Ausgabe
Parsing 1.234.567,89 as double gives 1234567.890000 in de_DE locale and 1.234000 in en_US parsing 1,234,567.89 as double using raw en_US facet gives 1234567.890000
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 427 | C++98 | num_get sollte jeden CharT akzeptieren, derdie Anforderungen für ein Zeichen erfüllt, auf dem eine der iostream-Komponenten instanziiert werden kann |
garantiert nur die Akzeptanz von char, wchar_t und anderen implementierungs- definierten Zeichentypen |
| LWG 2392 | C++98 | nur der Zeichentyp CharT könntevon num_get akzeptiert werden |
kann die Akzeptanz von implementierungs- definierten Zeichencontainertypen garantieren |
[bearbeiten] Siehe auch
| definiert Regeln für numerische Satzzeichen (Klassentemplate) | |
| formatiert numerische Werte für die Ausgabe als Zeichensequenz (Klassentemplate) | |
| extrahiert formatierte Daten (public member function of std::basic_istream<CharT,Traits>) |