Namespaces
Variants

std:: use_facet

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

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

プログラムは、Facetが facet であり、その定義にpublic staticメンバ id を含んでいない場合、またはvolatile修飾されたfacetである場合、不適格(ill-formed)です。

目次

変更点: - 「Contents」を「目次」に翻訳 - C++関連の用語(Parameters、Return value、Exceptions、Notes、Example、Defect reports、See also)は原文のまま保持 - HTMLタグ、属性、クラス名、ID、リンク先は一切変更せず - 数値や書式は完全に保持

パラメータ

loc - クエリするロケールオブジェクト

戻り値

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

例外

std::bad_cast がスローされる条件: std:: has_facet < Facet > ( loc ) == false の場合。

注記

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

// 悪い例:
auto& f = std::use_facet<std::moneypunct<char, true>>(std::locale{"no_NO.UTF-8"});
foo(f.curr_symbol()); // エラー: fは内部で既に存在しないstd::localeオブジェクトへの
                      // ダングリング参照を使用している
// 良い例:
auto loc = std::locale{"is_IS.UTF-8"}; // OK: 一時オブジェクトではない
auto& f = std::use_facet<std::moneypunct<char, true>>(loc);
foo(f.curr_symbol()); // OK: fは内部で既存のlocaleオブジェクトへの参照を使用している

ユーザーの優先ロケールで使用される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修飾は不可

関連項目

文化的差異をカプセル化する多相的なファセットの集合
(クラス)
ロケールが特定のファセットを実装しているかチェックする
(関数テンプレート)