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) 公開メンバ関数。対応するprotected仮想メンバ関数 do_narrow のオーバーロードを最も派生したクラスで呼び出す。オーバーロード(1)は do_narrow ( c, dflt ) を、オーバーロード(2)は do_narrow ( beg, end, dflt, dst ) を呼び出す。
3) 文字(ワイド文字の可能性あり) c を、その文字が単一バイトで表現可能な場合(例えばUTF-8エンコーディングにおけるASCII文字は単一バイト)にマルチバイト表現に変換します。そのような変換が存在しない場合は dflt を返します。
4) 文字配列 [ beg , end ) 内の各文字について、ナロー文字(またはナロー化が失敗した場合は dflt )を dst が指す文字配列の連続する位置に書き込む。

縮小変換は常に成功し、以下のすべての文字に対して常に可逆的です( widen() を呼び出すことで元に戻せます): 基本ソース文字セット (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 - 格納先の文字配列の先頭要素へのポインタ

戻り値

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 適用対象 公開時の動作 正しい動作
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> の公開メンバ関数)
ワイド文字を可能であれば単一バイトのナロー文字に変換する
(関数)