0

C++ 標準ライブラリにはいくつかの標準基本クラス ファセットがあり、その既定の動作は従来の "C" ロケールに依存します ( std::locale::classic())。bynameこれにより、プログラムが文化固有の機能を必要とする場合、その動作が構築時に指定されたロケールに依存する派生クラス ファセット (別名ファセット) に切り替えることが合理的になります。

たとえば、std::ctype従来の「C」文字分類を提供します。

§22.4.1.3.3

   static const mask* classic_table() noexcept;

table_size戻り値: 「C」ロケールでの文字の分類を表すサイズの配列の最初の要素へのポインター

これは、 の動作が、インストール先のロケールの動作std::ctype と機能的に異なるということですか? たとえば、日本語のロケールがあるとします。

std::locale loc("ja_JP");

そして、日本語の文字を分類するファセットを使いたいと思っていました。文字分類はstd::ctype次の目的のためのものです。

auto& f = std::use_facet<std::ctype<char>>(loc);

fctypeメソッドは、日本語ロケールに基づいて文字を分類しますか、それとも古典的な「C」ロケールに基づいて分類しますか? 私の最初の推測では、上記の標準の引用に基づく "C" ロケールですが、実際には日本語ロケールです。引用がここで起こっていることに同意しないのはなぜだろうと思っています。

ここに私の質問があります:

  • ctypectype が使用されているロケールに基づいて実際に分類するときに、標準で「C」文字分類を実行すると言うのはなぜですか?

  • 上記が当てはまるので、派生クラスのファセットはどこに入るのですか? 必要なロケールが基本クラスで既に使用されているのに、派生クラスのファセットを使用する必要があるのはなぜですか?

4

1 に答える 1

1

デフォルトで構築された std::ctype<char>ファセットのみがclassic_table分類に使用されます。system-provided から取得したファセット"ja_JP"はその例ではありません。

派生ファセットについて話すとき、人々は通常、システム提供のbynameファセットではなく、std::ctype などから派生したユーザー定義のファセットを指します。一部の文字クラスを再定義する場合は、派生ctypeファセットを使用できます。たとえば、コンマを空白として扱い、コンマ区切りの入力ストリームを解析したり、スペースやタブを空白として扱うのをやめたり、ストリームを行ごとに解析したりできます。 .

于 2013-07-24T01:27:24.617 に答える