std::ctype<CharT>:: narrow, do_narrow
|
Определено в заголовочном файле
<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
наиболее производного класса. Перегрузка (1) вызывает
do_narrow
(
c, dflt
)
, перегрузка (2) вызывает
do_narrow
(
beg, end, dflt, dst
)
.
[
beg
,
end
)
, записывает суженные символы (или
dflt
в случае неудачи сужения) в последовательные позиции массива символов, на который указывает
dst
.
Сужение всегда успешно и всегда обратимо (путем вызова widen() ) для всех символов из basic source character set (until C++23) basic character set (since C++23) .
- т.е. do_widen ( do_narrow ( c, 0 ) ) == c всегда выполняется для любого символа c из базового набора символов исходного кода (до C++23) базового набора символов (начиная с C++23) .
Сужение, если успешно, сохраняет все категории классификации символов, известные is() .
-
т.е.
is
(
m, c
)
||
!
ctc.
is
(
m, do_narrow
(
c, dflt
)
)
всегда
true
для любой именованной категории
ctypeс фасетомctype<char>ctc и значениемctype_base::maskm (если толькоdo_narrowне возвращает dflt ).
Сужение любого цифрового символа гарантирует, что если результат вычесть из символьного литерала '0' , разность будет равна цифровому значению исходного символа.
- т.е. для любой цифровой литеры c , выражение ( do_narrow ( c, dflt ) - '0' ) вычисляется в числовое значение литеры.
Содержание |
Параметры
| c | - | символ для преобразования |
| dflt | - | значение по умолчанию при неудачном преобразовании |
| beg | - | указатель на первый символ в массиве символов для преобразования |
| end | - | указатель на позицию за последним символом массива для преобразования |
| dst | - | указатель на первый элемент массива символов для заполнения |
Возвращаемое значение
Пример
#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>
)
|
|
|
сужает широкий символ до однобайтового узкого символа, если возможно
(функция) |