名前空間
変種
操作

std::use_facet

From cppreference.com
< cpp‎ | locale
 
 
 
 
ヘッダー <locale> で定義
template< class Facet >
const Facet& use_facet( const std::locale& loc );

loc によって実装されたファセットへの参照を取得します。

Facet が id という公開静的メンバを含む ファセット ではなく、または volatile 修飾されたファセットである場合、プログラムは不正形式となります。

目次

[編集] パラメータ

loc - 問い合わせ対象のロケールオブジェクト

[編集] 戻り値

ファセットへの参照を返します。この関数によって返される参照は、std::locale オブジェクトがそのファセットを参照している限り有効です。

[編集] 例外

std::bad_cast: std::has_facet<Facet>(loc) == false の場合。

[編集] 注記

use_facet から取得した Facet オブジェクトへの参照がステートメントの終了後に使用される場合、std::locale オブジェクトは一時オブジェクトであってはなりません。

// BAD:
auto& f = std::use_facet<std::moneypunct<char, true>>(std::locale{"no_NO.UTF-8"});
foo(f.curr_symbol()); // Error: f internally uses a dangling reference
                      // to a std::locale object that no longer exists.
// GOOD:
auto loc = std::locale{"is_IS.UTF-8"}; // OK: a non-temporary object
auto& f = std::use_facet<std::moneypunct<char, true>>(loc);
foo(f.curr_symbol()); // OK: f internally uses a reference to existing locale object.

[編集]

ユーザーの優先ロケールで使用される3文字の通貨名を表示します。

#include <iostream>
#include <locale>
 
int main()
{
    for (const char* name: {"en_US.UTF-8", "de_DE.UTF-8", "en_GB.UTF-8"})
        std::cout << "Your currency string is "
                  << std::use_facet<std::moneypunct<char, true>>(std::locale{name}).
                     curr_symbol() << '\n';
}

出力

Your currency string is USD
Your currency string is EUR
Your currency string is GBP

[編集] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 31 C++98 返された参照は有効であり続けました
ロケール値自体が存在する限り
返された参照は、次のように有効であり続けます。
いくつかのロケールオブジェクトがそのファセットを参照している限り
LWG 38 C++98 Facet は直接メンバ id を持つ必要はありませんでした 必要
LWG 436 C++98 Facet が cv 修飾可能かどうかは不明でした const 修飾は可能ですが、volatile 修飾は不可能です。

[編集] 関連項目

文化的な違いをカプセル化するポリモーフィックなファセットのセット
(クラス) [編集]
ロケールが特定のファセットを実装しているかチェックする
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)