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() を呼び出すことで元に戻せます): 基本ソース文字セット (C++23まで) 基本文字セット (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
)
)
は、任意の名前付き
ctypeカテゴリについて、ctype<char>ファセット ctc とctype_base::mask値 m に対して常に true となる(ただし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 | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| 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>
の公開メンバ関数)
|
|
|
ワイド文字を可能であれば単一バイトのナロー文字に変換する
(関数) |