std:: num_get
|
ヘッダーで定義
<locale>
|
||
|
template
<
class
CharT,
|
||
クラス
std::num_get
は、数値の文字列表現を解析するための規則をカプセル化します。具体的には、
bool
、
unsigned
short
、
unsigned
int
、
long
、
unsigned
long
、
long
long
、
unsigned
long
long
(C++11以降)
、
float
、
double
、
long
double
、および
void
*
型がサポートされています。標準の書式化入力演算子(例:
cin
>>
n
;
)は、数値のテキスト表現を解析するために、I/Oストリームのロケールの
std::num_get
ファセットを使用します。
継承図
std::num_get
の特殊化が標準ライブラリによって提供されることが保証されていない場合(下記参照)、その
get()
および
do_get()
の動作は指定通りであることが保証されません。
目次 |
特殊化
標準ライブラリは以下の特殊化を提供することが保証されています(これらは あらゆるロケールオブジェクトで実装が必須 とされています):
|
ヘッダーで定義
<locale>
|
|
| std :: num_get < char > | ナロウ文字列の数値解析を作成 |
| std :: num_get < wchar_t > | ワイド文字列の数値解析を作成 |
さらに、標準ライブラリは以下の型要件を満たすすべての特殊化を提供することも保証されています:
-
CharTは以下のいずれかです:- char 、
- wchar_t 、および
- その他の実装定義の 文字コンテナ型 ( iostreamコンポーネント がインスタンス化できる文字の要件を満たすもの);および
-
InputItは LegacyInputIterator の要件を満たさなければなりません。
ネスト型
| 型 | 定義 |
char_type
|
CharT
|
iter_type
|
InputIt
|
データメンバ
| メンバー | 説明 |
std::locale::id
id
[static]
|
facet の識別子 |
メンバー関数
新しい
num_get
ファセットを構築する
(public member function) |
|
do_get
を呼び出す
(public member function) |
プロテクテッドメンバー関数
num_get
ファセットを破棄する
(protected member function) |
|
|
[virtual]
|
入力ストリームから数値を解析する
(virtual protected member function) |
例
#include <iostream> #include <iterator> #include <locale> #include <sstream> #include <string> int main() { std::string de_double = "1.234.567,89"; std::string us_double = "1,234,567.89"; // ストリームを使用した解析 std::istringstream de_in(de_double); de_in.imbue(std::locale("de_DE.UTF-8")); double f1; de_in >> f1; std::istringstream us_in(de_double); us_in.imbue(std::locale("en_US.UTF-8")); double f2; us_in >> f2; std::cout << "Parsing " << de_double << " as double gives " << std::fixed << f1 << " in de_DE locale and " << f2 << " in en_US\n"; // ファセットを直接使用 std::istringstream s3(us_double); s3.imbue(std::locale("en_US.UTF-8")); auto& f = std::use_facet<std::num_get<char>>(s3.getloc()); std::istreambuf_iterator<char> beg(s3), end; double f3; std::ios::iostate err; f.get(beg, end, s3, err, f3); std::cout << "parsing " << us_double << " as double using raw en_US facet gives " << f3 << '\n'; }
出力:
Parsing 1.234.567,89 as double gives 1234567.890000 in de_DE locale and 1.234000 in en_US parsing 1,234,567.89 as double using raw en_US facet gives 1234567.890000
不具合報告
以下の動作変更に関する欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の仕様 | 修正後の仕様 |
|---|---|---|---|
| LWG 427 | C++98 |
num_get
はあらゆる
CharT
を受け入れることが保証されていた
(iostreamコンポーネントのインスタンス化が可能な 文字要件を満たすもの) |
以下のみを受け入れることが保証される:
char
,
wchar_t およびその他の実装定義の 文字型 |
| LWG 2392 | C++98 |
文字型
CharT
のみが
num_get
による受け入れが保証されていた
|
実装定義の文字コンテナ型の
受け入れを保証可能 |
関連項目
|
数値の区切り規則を定義する
(クラステンプレート) |
|
|
数値を文字シーケンスとして出力するためのフォーマットを行う
(クラステンプレート) |
|
|
フォーマットされたデータを抽出する
(
std::basic_istream<CharT,Traits>
の
公開メンバ関数)
|