Share via


num_get クラス

CharType 型のシーケンスから数値への変換を制御するためにロケール ファセットとして使用できるオブジェクトを表すクラス テンプレート。

構文

template <class CharType, class InputIterator = istreambuf_iterator<CharType>>
class num_get : public locale::facet;

パラメーター

CharType
ロケールの文字をエンコードするためにプログラム内で使用される型。

InputIterator
数値の get 関数が入力を読み取る反復子の型。

解説

すべてのロケールのファセットと同様、静的オブジェクト ID に最初に格納されている値は 0 です。 格納されている値に初めてアクセスしようとすると、id に一意の正の値が格納されます。

コンストラクター

コンストラクター 説明
num_get シーケンスから数値を抽出するために使用される num_get 型のオブジェクトのコンストラクター。

Typedefs

型名 説明
char_type ロケールによって使用される文字を表すために使用される型。
iter_type 入力反復子を表す型。

メンバー関数

メンバー関数 説明
do_get 文字シーケンスから数値またはブール値を抽出するために呼び出される仮想関数。
get 文字シーケンスから数値のまたはブール値を抽出します。

必要条件

ヘッダー:<locale>

名前空間: std

num_get::char_type

ロケールによって使用される文字を表すために使用される型。

typedef CharType char_type;

解説

この型は、テンプレート パラメーター CharType のシノニムです。

num_get::d o_get

文字シーケンスから数値またはブール値を抽出するために呼び出される仮想関数。

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned short& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned int& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned long& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long long& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned long long& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    float& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    double& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long double& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    void *& val) const;

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    bool& val) const;

パラメーター

first
数値を読み取る文字の範囲の開始位置。

last
数値を読み取る文字の範囲の終了位置。

iosbase
変換で使用されるフラグが含まれる Ios_base

状態
失敗した場合に failbit が追加される状態 (「ios_base::iostate」を参照)。

val
読み取られた値。

戻り値

値が読み取られた後の反復子。

解説

1 番目のプロテクト仮想メンバー関数:

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long& val) const;

この関数は、シーケンス [first, last)first から始め、空でない完全な整数入力フィールドを認識するまで、連続した要素と一致します。 成功すると、このフィールドを long 型の同等の値に変換し、結果を val に格納します。 これは、数値入力フィールドを超える先頭の要素を指す反復子を返します。 それ以外の場合、この関数は val に何も格納しないで、stateios_base::failbit を設定します。 これは、有効な整数入力フィールドのプレフィックスを超える先頭の要素を指す反復子を返します。 いずれの場合も、戻り値が last と等しい場合、関数は stateios_base::eofbit を設定します。

整数入力フィールドは、スキャン機能がファイルから一連の char 要素と一致および変換する際に使用する規則と同じ規則で変換されます。 (このような char 各要素は、単純な 1 対 1 のマッピングによって、型の Elem 同等の要素にマップされると見なされます)。同等のスキャン変換仕様は、次のように決定されます。

iosbase.ios_base::flags() & ios_base::basefield == ios_base::oct の場合、変換仕様は lo です。

iosbase.flags() & ios_base::basefield == ios_base::hex の場合、変換仕様は lx です。

iosbase.flags() & ios_base::basefield == 0 の場合、変換仕様は li です。

それ以外の場合、変換仕様は ld です。

整数入力フィールドの形式は、さらに、ロケール ファセットfac で決定されます。これは、use_facet<numpunct<Elem>(iosbase.ios_base::getloc()) の呼び出しによって返されます。 具体的な内容は次のとおりです。

fac.numpunct::grouping() は、小数点の左側の数字をグループ化する方法を決定します。

fac.numpunct::thousands_sep() は、小数点の左側にある数字のグループを区切るシーケンスを決定します。

数値入力フィールドに fac.thousands_sep() のインスタンスがない場合、グループ化の制約は強制されません。 それ以外の場合は、fac.grouping() によって強制されたグループ化の制約が適用され、スキャンの変換が行われる前に区切り記号が削除されます。

4 番目のプロテクト仮想メンバー関数:

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned long& val) const;

この関数の動作は 1 番目と同じですが、ld の変換仕様を lu に置き換えている点が異なります。 成功すると、数値入力フィールドを unsigned long 型の値に変換し、その値を val に格納します。

5 番目のプロテクト仮想メンバー関数:

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long long& val) const;

この関数の動作は 1 番目と同じですが、ld の変換仕様を lld に置き換えている点が異なります。 成功すると、数値入力フィールドを long long 型の値に変換し、その値を val に格納します。

6 番目のプロテクト仮想メンバー関数:

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned long long& val) const;

この関数の動作は 1 番目と同じですが、ld の変換仕様を llu に置き換えている点が異なります。 成功すると、数値入力フィールドを unsigned long long 型の値に変換し、その値を val に格納します。

7 番目のプロテクト仮想メンバー関数:

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    float& val) const;

この関数の動作は 1 番目と同じですが、空でない完全な浮動小数点入力フィールドとの一致を試みる点が異なります。 fac.numpunct::decimal_point() は、整数桁と小数桁を区切るシーケンスを決定します。 同等のスキャン変換指定子は lf です。

8 番目のプロテクト仮想メンバー関数:

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    double& val) const;

この関数の動作は 1 番目と同じですが、空でない完全な浮動小数点入力フィールドとの一致を試みる点が異なります。 fac.numpunct::decimal_point() は、整数桁と小数桁を区切るシーケンスを決定します。 同等のスキャン変換指定子は lf です。

9 番目のプロテクト仮想メンバー関数:

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long double& val) const;

この関数の動作は 8 番目と同じですが、同等のスキャン変換指定子が Lf である点が異なります。

10 番目のプロテクト仮想メンバー関数:

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    void *& val) const;

この関数の動作は 1 番目と同じですが、同等のスキャン変換指定子が p である点が異なります。

最後 (11 番目) のプロテクト仮想メンバー関数:

virtual iter_type do_get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    bool& val) const;

この関数の動作は 1 番目と同じですが、空でない完全なブール値入力フィールドとの一致を試みる点が異なります。 成功すると、ブール値入力フィールドを bool 型の値に変換し、その値を val に格納します。

ブール値入力フィールドは、次の 2 つの形式のいずれかになります。 iosbase.flags() & ios_base::boolalpha が false の場合、これは整数入力フィールドと同じですが、変換後の値が 0 (false の場合) または 1 (true の場合) のいずれかである必要がある点が異なります。 それ以外の場合、シーケンスは fac.numpunct::falsename() (false の場合) または fac.numpunct::truename() (true の場合) のいずれかに一致する必要があります。

get の例 (仮想メンバー関数が do_get で呼び出される) を参照してください。

num_get::get

文字シーケンスから数値のまたはブール値を抽出します。

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    bool& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned short& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned int& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned long& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long long& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned long long& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    float& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    double& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long double& val) const;

iter_type get(
    iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    void *& val) const;

パラメーター

first
数値を読み取る文字の範囲の開始位置。

last
数値を読み取る文字の範囲の終了位置。

iosbase
変換で使用されるフラグが含まれる Ios_base

状態
失敗した場合に failbit が追加される状態 (「ios_base::iostate」を参照)。

val
読み取られた値。

戻り値

値が読み取られた後の反復子。

解説

すべてのメンバー関数が do_get( first, last, iosbase, state, val) を返します。

1 番目のプロテクト仮想メンバー関数は、シーケンス [ first, last) の先頭から始め、空でない完全な整数入力フィールドを認識するまで、連続した要素との一致を試みます。 成功すると、このフィールドを long 型の同等の値に変換し、結果を val に格納します。 これは、数値入力フィールドを超える先頭の要素を指す反復子を返します。 それ以外の場合、この関数は val に何も格納しないで、stateios_base::failbit を設定します。 これは、有効な整数入力フィールドのプレフィックスを超える先頭の要素を指す反復子を返します。 いずれの場合も、戻り値が last と等しい場合、関数は stateios_base::eofbit を設定します。

整数入力フィールドは、スキャン機能がファイルから一連の char 要素と一致および変換する際に使用する規則と同じ規則で変換されます。 このような char 要素は、単純な一対一のマッピングで CharType 型の同等の要素にマップされると想定されます。 同等のスキャン変換仕様は次のように決定されます。

  • iosbase.flags& ios_base::basefield == ios_base::oct の場合、変換仕様は lo です。

  • iosbase.flags & ios_base::basefield == ios_base::hex の場合、変換仕様は lx です。

  • iosbase.flags & ios_base::basefield == 0 の場合、変換仕様は li です。

  • それ以外の場合、変換仕様は ld です。

整数入力フィールドの形式は、さらに、ロケール ファセットfac で決定されます。これは、use_facet<numpunct<Elem>(iosbase.getloc()) の呼び出しによって返されます。 具体的な内容は次のとおりです。

  • fac.grouping は、小数点の左側の数字をグループ化する方法を決定します。

  • fac.thousands_sep は、小数点の左側にある数字のグループを区切るシーケンスを決定します。

数値入力フィールドに fac.thousands_sep のインスタンスがない場合、グループ化の制約は強制されません。 それ以外の場合は、fac.grouping によって強制されたグループ化の制約が適用され、スキャンの変換が行われる前に区切り記号が削除されます。

2 番目のプロテクト仮想メンバー関数:

virtual iter_type do_get(iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    unsigned long& val) const;

この関数の動作は 1 番目と同じですが、ld の変換仕様を lu に置き換えている点が異なります。 成功すると、数値入力フィールドを unsigned long 型の値に変換し、その値を val に格納します。

3 番目のプロテクト仮想メンバー関数:

virtual iter_type do_get(iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    double& val) const;

この関数の動作は 1 番目と同じですが、空でない完全な浮動小数点入力フィールドとの一致を試みる点が異なります。 fac.decimal_point は、整数桁と小数桁を区切るシーケンスを決定します。 同等のスキャン変換指定子は lf です。

4 番目のプロテクト仮想メンバー関数:

virtual iter_type do_get(iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    long double& val) const;

この関数の動作は 3 番目と同じですが、同等のスキャン変換指定子が Lf である点が異なります。

5 番目のプロテクト仮想メンバー関数:

virtual iter_type do_get(iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    void *& val) const;

この関数の動作は 1 番目と同じですが、同等のスキャン変換指定子が p である点が異なります。

6 番目のプロテクト仮想メンバー関数:

virtual iter_type do_get(iter_type first,
    iter_type last,
    ios_base& iosbase,
    ios_base::iostate& state,
    bool& val) const;

この関数の動作は 1 番目と同じですが、空でない完全なブール値入力フィールドとの一致を試みる点が異なります。 成功すると、ブール値入力フィールドを bool 型の値に変換し、その値を val に格納します。

ブール値入力フィールドは、次の 2 つの形式のいずれかになります。 iosbase.flags & ios_base::boolalphafalse の場合、これは整数入力フィールドと同じですが、変換後の値が 0 (false の場合) または 1 (true の場合) のいずれかである必要がある点が異なります。 それ以外の場合、シーケンスは、fac.falsename (false の場合) または fac.truename (true の場合) のいずれかに一致する必要があります。

// num_get_get.cpp
// compile with: /EHsc
#include <locale>
#include <iostream>
#include <sstream>
using namespace std;
int main( )
{
   locale loc( "german_germany" );

   basic_stringstream<char> psz, psz2;
   psz << "-1000,56";

   ios_base::iostate st = 0;
   long double fVal;
   cout << use_facet <numpunct <char> >(loc).thousands_sep( ) << endl;

   psz.imbue( loc );
   use_facet <num_get <char> >
   (loc).get( basic_istream<char>::_Iter( psz.rdbuf( ) ),
           basic_istream<char>::_Iter(0), psz, st, fVal );

   if ( st & ios_base::failbit )
      cout << "money_get( ) FAILED" << endl;
   else
      cout << "money_get( ) = " << fVal << endl;
}

num_get::iter_type

入力反復子を表す型。

typedef InputIterator iter_type;

解説

この型は、テンプレート パラメーター InputIteratorのシノニムです。

num_get::num_get

シーケンスから数値を抽出するために使用される num_get 型のオブジェクトのコンストラクター。

explicit num_get(size_t refs = 0);

パラメーター

refs
オブジェクトのメモリ管理の種類を指定するために使用する整数値。

解説

refs パラメーターの可能な値とその重要性は次のとおりです。

  • 0: オブジェクトの有効期間はそれが含まれるロケールによって管理されます。

  • 1: オブジェクトの有効期間を手動で管理する必要があります。

  • > 1: これらの値は定義されていません。

デストラクターが保護されているため、利用できる直接的な例はありません。

コンストラクターは、locale::facet(refs) を使用してその基本オブジェクトを初期化します。

関連項目

<ロケール>
facet クラス
C++ 標準ライブラリ内のスレッド セーフ