Namespaces
Variants

std::ctype<CharT>:: narrow, do_narrow

From cppreference.net
Definiert in Header <locale>
public :
char narrow ( CharT c, char dflt ) const ;
(1)
public :

const CharT * narrow ( const CharT * beg, const CharT * end,

char dflt, char * dst ) const ;
(2)
protected :
virtual char do_narrow ( CharT c, char dflt ) const ;
(3)
protected :

virtual const CharT * do_narrow ( const CharT * beg, const CharT * end,

char dflt, char * dst ) const ;
(4)
1,2) Öffentliche Memberfunktion, ruft die entsprechende geschützte virtuelle Memberfunktion do_narrow der abgeleitetesten Klasse auf. Überladung (1) ruft do_narrow ( c, dflt ) auf, Überladung (2) ruft do_narrow ( beg, end, dflt, dst ) auf.
3) Wandelt das (möglicherweise breite) Zeichen c in eine Multibyte-Darstellung um, wenn das Zeichen mit einem einzelnen Byte dargestellt werden kann (zum Beispiel sind ASCII-Zeichen in UTF-8-Kodierung einzelne Bytes). Gibt dflt zurück, wenn eine solche Konvertierung nicht existiert.
4) Für jedes Zeichen im Zeichenarray [ 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() ).

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 ctype Kategorie mit einem ctype<char> Facet ctc und einem ctype_base::mask Wert m (sofern do_narrow nicht 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

1,3) Eingeschränktes Zeichen oder dflt falls Einschränkung fehlschlägt.
2,4) end

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)