| Localization library | |||||||||||||||||||||||||
| Regular expressions library(C++11) | |||||||||||||||||||||||||
| Formatting library(C++20) | |||||||||||||||||||||||||
| Null-terminated sequence utilities | |||||||||||||||||||||||||
| Byte strings | |||||||||||||||||||||||||
| Multibyte strings | |||||||||||||||||||||||||
| Wide strings | |||||||||||||||||||||||||
| Primitive numeric conversions | |||||||||||||||||||||||||
| |||||||||||||||||||||||||
| Text encoding identifications | |||||||||||||||||||||||||
| |||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
ctype::narrowctype::do_narrow | ||||
| Member functions of ctype<char> | ||||
Defined in header <locale> | ||
public: char narrow( CharT c,char dflt)const; | (1) | |
public: const CharT* narrow(const CharT* beg,const CharT* end, | (2) | |
protected: virtualchar do_narrow( CharT c,char dflt)const; | (3) | |
protected: virtualconst CharT* do_narrow(const CharT* beg,const CharT* end, | (4) | |
do_narrow overload of the most derived class. Overload (1) callsdo_narrow(c, dflt), overload (2) callsdo_narrow(beg, end, dflt, dst).[beg, end), writes narrowed characters (ordflt whenever narrowing fails) to the successive locations in the character array pointed to bydst.Narrowing is always successful and is always reversible (by callingwiden()) for all characters from thebasic source character set(until C++23)basic character set(since C++23).
Narrowing, if successful, preserves all character classification categories known tois().
ctype category with actype<char> facetctc andctype_base::mask valuem (unlessdo_narrow returnsdflt).Narrowing of any digit character guarantees that if the result is subtracted from the character literal'0', the difference equals the digit value of the original character.
Contents |
| c | - | character to convert |
| dflt | - | default value to produce if the conversion fails |
| beg | - | pointer to the first character in an array of characters to convert |
| end | - | one past the end pointer for the array of characters to convert |
| dst | - | pointer to the first element of the array of characters to fill |
#include <iostream>#include <locale> void try_narrow(conststd::ctype<wchar_t>& f,wchar_t c){char n= f.narrow(c,0);if(n)std::wcout<<'\''<< c<<"' narrowed to "<<+(unsignedchar)n<<'\n';elsestd::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'ě');}
Possible output:
In US English UTF-8 locale:'A' narrowed to 0x41'A' could not be narrowed'ě' could not be narrowedIn Czech ISO-8859-2 locale:'A' narrowed to 0x41'A' could not be narrowed'ě' narrowed to 0xec
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 126 | C++98 | 1. the code representing reversibility was do_widen(do_narrow(c),0)== c 2. the code representing category preservation was is(m, c)||!ctc.is(m, do_narrow(c), dflt) | corrected both |
| LWG 153 | C++98 | narrow always called overload (4) | calls the corresponding overload |
invokesdo_widen(public member function)[edit] | |
| narrows characters (public member function of std::basic_ios<CharT,Traits>)[edit] | |
| narrows a wide character to a single-byte narrow character, if possible (function)[edit] |