C では、16 進ストリーム マニピュレータを使用して、整数を 16 進形式で出力する便利な方法が提供されます。この記事では、ストリーム上の次の項目を変更するカスタム ストリーム マニピュレータの作成方法について説明します。
具体的には、出力される次の整数の値を 1 ずつ増やす plusone マニピュレータを作成することを目的としています。これを実現するには、次のようにします。各ストリームに何らかの状態を保存する必要があります。この目的のために、iword 関数と xalloc によって割り当てられたインデックスを使用できます。
inline int geti() { static int i = ios_base::xalloc(); return i; } ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; } ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }
この状態を適切に配置すると、すべてのストリームでそれを取得できます。数値の書式設定を実行する出力操作にフックするために、カスタム ファセットを定義します。
struct my_num_put : num_put<char> { iter_type do_put(iter_type s, ios_base& f, char_type fill, long v) const { return num_put<char>::do_put(s, f, fill, v + f.iword(geti())); } iter_type do_put(iter_type s, ios_base& f, char_type fill, unsigned long v) const { return num_put<char>::do_put(s, f, fill, v + f.iword(geti())); } };
このファセットは、ストリーム状態に格納されている値を、出力される数値に追加します。
ここで、 plusone マニピュレータをテストできます。
int main() { // outputs: 11121011 cout.imbue(locale(locale(),new my_num_put)); cout << add_one << 10 << 11 << add_none << 10 << 11; }
このコードは、ストリーム上の次の項目を変更するカスタム ストリーム マニピュレータを定義する方法を示しています。次の項目のみがインクリメントされるようにするには、各 do_put 呼び出し後にストリームの状態を 0 にリセットします。
以上がC で次に出力される整数をインクリメントするカスタム ストリーム マニピュレーターを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。