C でのカスタム ストリーム マニピュレータの変更
カスタム マニピュレータを使用してストリーム上の将来のアイテムを変更することは、C の多用途な手法です。 「hex」のようなマニピュレータは出力形式を変更しますが、「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; }
ファセットを利用して、数値出力をカスタマイズできます。 my_num_put 構造体は、保存された状態に基づいて値をインクリメントする do_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())); } };
このマニピュレータを適用すると、数値出力が変更されます:
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 サイトの他の関連記事を参照してください。