## 3.4 ロケールオブジェクト

C++ ロケールオブジェクトは、 国際化サービスをカプセル化したファセットオブジェクトを収めるコンテナであり、文化や言語に依存した情報を表します。この節では、ロケールを作成するための locale クラスの関数について説明します。

>     class locale {
>         public:
>     // 作成/コピー/破棄:
>           explicit locale(const char* std_name);                  //1
>     // 大域ロケールオブジェクト:
>           static const locale& classic();                         //2
>     };

//1 | ロケールオブジェクトは、C 言語でのロケールの外部実装から作成することができます。コンストラクタ locale::locale(const char* std_name) は、C 言語でのロケールの名前を参照します。これは、 C ライブラリ関数 setlocale() に対する呼び出しに使用するロケール名と同じはたらきをします。
//2 | 定義済みのロケールオブジェクトである locale::classic() も使用します。これは、アメリカ英語 ASCII 環境を表します。

前述のコンストラクタの詳細については、『標準 C++ クラスライブラリ・リファレンス』を参照してください。

ロケールは不変オブジェクトです。作成したロケールオブジェクトを変更することはできません。これによってロケールの信頼性を確保し、使いやすさを実現しています。コンテナに保持されたエレメントに対するポインタや参照を使用するときは、ポインタと参照の有効性に留意してください。コンテナが変更されると、エレメントに対するポインタと参照は無効になります。

ロケールオブジェクトもコンテナです。ただし、不変のコンテナであり、変更することはできません。そのため、ロケールオブジェクトやそのコピーが存在する限り、ロケールのファセットオブジェクトに対する参照を設定し、有効性に注意することなく参照を受け渡しすることができます。ロケールオブジェクトは変更されないため、ファセットが偶発的に変更されることもありません。

ときには、アメリカ合衆国対応のクラシックロケールや、大域ロケールのスナップショット以外のロケールオブジェクトが必要な状況もあるでしょう。しかし、ロケールは不変オブジェクトなので、任意のロケールを指定し、そのファセットオブジェクトを変更することはできません。この場合は、構築時に構築方法を指定してください。

合成によってロケールオブジェクトを作成するために、いくつかの locale クラスのコンストラクタがあります。合成とは、既存のロケールオブジェクトをコピーし、ファセットオブジェクトを 1 つ以上交換してロケールオブジェクトを作成する方法です。

>     class locale {
>     public:
>       locale(const locale& other, const char* std_name, category);
>       template <class Facet> locale(const locale& other, Facet* f);
>       locale(const locale& other, const locale& one, category);
>     };

以下の例は、クラシックロケールオブジェクトのコピーからロケールオブジェクトを作成し、ドイツ語ロケールオブジェクトから数字ファセットオブジェクトを取り出す方法を示したものです。

>     locale loc ( locale::classic(), locale("De_DE"), LC_NUMERIC );

前述のコンストラクタの詳細については、『標準 C++ クラスライブラリ・リファレンス』を参照してください。

ロケールオブジェクトのコピーは容易であり、値でロケールオブジェクトを受け渡しするのは簡単です。ロケールオブジェクトをコピーして新しいロケールオブジェクトを合成したり、ロケールオブジェクトのコピーを関数に対する引数として渡すこともできます。

ロケールは、参照カウントとハンドル-本体イディオムで実装します。ロケールオブジェクトのコピーではハンドルだけが複製されるため、高速かつ経済的に処理することができます。同様に、大域ロケールオブジェクトのコピーと同じであるため、デフォルトコンストラクタによるロケールオブジェクトの作成も経済的です。2 番目のロケールを引数として使用する他のロケールコンストラクタは、ロケールオブジェクトの本体のクローンを作成するため、少しコストがかかります。しかし、ファセットのすべてをコピーする必要はありません。byname コンストラクタは、外部ロケールの実装からロケールを作成するため、最もコストがかかります。

図 10 は、ロケールのアーキテクチャーの概要を示しています。これはファセットのポインタに対するベクトルを表します。ファセットも参照カウントです。

#### 図 10 -- ロケールのアーキテクチャー

Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。

OEM リリース, 1998 年 6 月