後続のストリーム項目を変更するためのカスタム C ストリーム マニピュレータ
C では、16 進数マニピュレータを使用して数値を 16 進表現に変換できます。 。ただし、現在の項目だけでなくストリーム上の後続の項目も変更する必要がある場合はどうすればよいでしょうか?
plusone マニピュレータの作成
ストリーム上の次の数値を確認するには、次の手順に従います:
1.各ストリームに状態を保存:
iword と geti() を使用して、各ストリームに状態を保存します。
inline int geti() { static int i = ios_base::xalloc(); return i; }
2.マニピュレータ関数の定義:
保存された状態を設定および設定解除する関数を作成します。
ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; } ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }
3.数値出力のインターセプト:
数値出力をインターセプトし、保存されている増分を適用する my_num_put ファセットを作成します。
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())); } };
4.マニピュレータをテストします:
マニピュレータを使用して次の数値を増分し、結果を表示します。
int main() { // outputs: 11121011 cout.imbue(locale(locale(),new my_num_put)); cout << add_one << 10 << 11 << add_none << 10 << 11; }
単回使用の増分をリセット:
次の数値のみをインクリメントしたい場合は、do_put を呼び出すたびに保存された状態をリセットします。
以上がカスタム C ストリーム マニピュレータを作成して後続のストリーム アイテムを変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。