std::ctype<CharT>:: narrow, do_narrow
|
Definiert in Header
<locale>
|
||
|
public
:
char narrow ( CharT c, char dflt ) const ; |
(1) | |
|
public
:
const
CharT
*
narrow
(
const
CharT
*
beg,
const
CharT
*
end,
|
(2) | |
|
protected
:
virtual char do_narrow ( CharT c, char dflt ) const ; |
(3) | |
|
protected
:
virtual
const
CharT
*
do_narrow
(
const
CharT
*
beg,
const
CharT
*
end,
|
(4) | |
do_narrow
der abgeleitetesten Klasse auf. Überladung (1) ruft
do_narrow
(
c, dflt
)
auf, Überladung (2) ruft
do_narrow
(
beg, end, dflt, dst
)
auf.
[
beg
,
end
)
schreibt verengte Zeichen (oder
dflt
wenn Verengung fehlschlägt) in die aufeinanderfolgenden Speicherstellen im Zeichenarray, auf das
dst
zeigt.
Die Verengung ist immer erfolgreich und für alle Zeichen aus dem basic source character set (until C++23) basic character set (since C++23) immer umkehrbar (durch Aufruf von widen() ).
- d.h. do_widen ( do_narrow ( c, 0 ) ) == c gilt für jedes Zeichen c im basic source character set (until C++23) basic character set (since C++23) .
Narrowing, wenn erfolgreich, bewahrt alle Zeichenklassifizierungskategorien, die is() bekannt sind.
-
d.h.
is
(
m, c
)
||
!
ctc.
is
(
m, do_narrow
(
c, dflt
)
)
ist immer
true
für jede benannte
ctypeKategorie mit einemctype<char>Facet ctc und einemctype_base::maskWert m (soferndo_narrownicht dflt zurückgibt).
Die Verengung eines beliebigen Ziffernzeichens garantiert, dass wenn das Ergebnis vom Zeichenliteral '0' subtrahiert wird, die Differenz dem Ziffernwert des ursprünglichen Zeichens entspricht.
- d.h. für jedes Ziffernzeichen c , der Ausdruck ( do_narrow ( c, dflt ) - '0' ) ergibt den Ziffernwert des Zeichens.
Inhaltsverzeichnis |
Parameter
| c | - | zu konvertierendes Zeichen |
| dflt | - | Standardwert bei fehlgeschlagener Konvertierung |
| beg | - | Zeiger auf das erste Zeichen im zu konvertierenden Zeichenarray |
| end | - | Zeiger auf das Ende-plus-eins des zu konvertierenden Zeichenarrays |
| dst | - | Zeiger auf das erste Element des zu füllenden Zeichenarrays |
Rückgabewert
Beispiel
#include <iostream> #include <locale> void try_narrow(const std::ctype<wchar_t>& f, wchar_t c) { char n = f.narrow(c, 0); if (n) std::wcout << '\'' << c << "' narrowed to " << +(unsigned char)n << '\n'; else std::wcout << '\'' << c << "' could not be narrowed\n"; } int main() { std::locale::global(std::locale("en_US.utf8")); std::wcout.imbue(std::locale()); std::wcout << std::hex << std::showbase << "In US English UTF-8 locale:\n"; auto& f = std::use_facet<std::ctype<wchar_t>>(std::locale()); try_narrow(f, L'A'); try_narrow(f, L'A'); try_narrow(f, L'ě'); std::locale::global(std::locale("cs_CZ.iso88592")); auto& f2 = std::use_facet<std::ctype<wchar_t>>(std::locale()); std::wcout << "In Czech ISO-8859-2 locale:\n"; try_narrow(f2, L'A'); try_narrow(f2, L'A'); try_narrow(f2, L'ě'); }
Mögliche Ausgabe:
In US English UTF-8 locale: 'A' narrowed to 0x41 'A' could not be narrowed 'ě' could not be narrowed In Czech ISO-8859-2 locale: 'A' narrowed to 0x41 'A' could not be narrowed 'ě' narrowed to 0xec
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 126 | C++98 |
1. der Code, der Reversibilität repräsentierte, war
do_widen ( do_narrow ( c ) , 0 ) == c 2. der Code, der Kategorieerhaltung repräsentierte, war is ( m, c ) || ! ctc. is ( m, do_narrow ( c ) , dflt ) |
beide korrigiert |
| LWG 153 | C++98 |
narrow
rief immer Überladung (4) auf
|
ruft die entsprechende Überladung auf |
Siehe auch
ruft
do_widen
auf
(öffentliche Elementfunktion) |
|
|
verengt Zeichen
(öffentliche Elementfunktion von
std::basic_ios<CharT,Traits>
)
|
|
|
verengt ein Breitzeichen zu einem Einzelbyte-Zeichen, falls möglich
(Funktion) |