std::use_facet
From cppreference.com
| ヘッダー <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 修飾は不可能です。 |
[編集] 関連項目
| 文化的な違いをカプセル化するポリモーフィックなファセットのセット (クラス) | |
| ロケールが特定のファセットを実装しているかチェックする (関数テンプレート) |