Namespaces
Variants

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

From cppreference.net
Определено в заголовочном файле <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) Публичная функция-член, вызывает соответствующую перегрузку защищённой виртуальной функции-члена do_narrow наиболее производного класса. Перегрузка (1) вызывает do_narrow ( c, dflt ) , перегрузка (2) вызывает do_narrow ( beg, end, dflt, dst ) .
3) Преобразует (возможно, широкий) символ c в многобайтовое представление, если символ может быть представлен одним байтом (например, символы ASCII в кодировке UTF-8 являются однобайтовыми). Возвращает dflt если такое преобразование невозможно.
4) Для каждого символа в массиве символов [ beg , end ) , записывает суженные символы (или dflt в случае неудачи сужения) в последовательные позиции массива символов, на который указывает dst .

Сужение всегда успешно и всегда обратимо (путем вызова widen() ) для всех символов из basic source character set (until C++23) basic character set (since C++23) .

Сужение, если успешно, сохраняет все категории классификации символов, известные is() .

  • т.е. is ( m, c ) || ! ctc. is ( m, do_narrow ( c, dflt ) ) всегда true для любой именованной категории ctype с фасетом ctype<char> ctc и значением ctype_base::mask m (если только do_narrow не возвращает dflt ).

Сужение любого цифрового символа гарантирует, что если результат вычесть из символьного литерала '0' , разность будет равна цифровому значению исходного символа.

  • т.е. для любой цифровой литеры c , выражение ( do_narrow ( c, dflt ) - '0' ) вычисляется в числовое значение литеры.

Содержание

Параметры

c - символ для преобразования
dflt - значение по умолчанию при неудачном преобразовании
beg - указатель на первый символ в массиве символов для преобразования
end - указатель на позицию за последним символом массива для преобразования
dst - указатель на первый элемент массива символов для заполнения

Возвращаемое значение

1,3) Суженный символ или dflt если сужение не удалось.
2,4) end

Пример

#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'ě');
}

Возможный вывод:

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

Отчёты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 126 C++98 1. код, представляющий обратимость, был
do_widen ( do_narrow ( c ) , 0 ) == c
2. код, представляющий сохранение категории, был
is ( m, c ) || ! ctc. is ( m, do_narrow ( c ) , dflt )
исправлены оба
LWG 153 C++98 narrow всегда вызывал перегрузку (4) вызывает соответствующую перегрузку

Смотрите также

вызывает do_widen
(публичная функция-член)
сужает символы
(публичная функция-член std::basic_ios<CharT,Traits> )
сужает широкий символ до однобайтового узкого символа, если возможно
(функция)