C で後続の出力を変更するためのカスタム ストリーム マニピュレーター
C では、ストリーム マニピュレーターは、入出力操作をカスタマイズおよび強化するための強力なツールです。一般的なマニピュレータの 1 つは std::hex で、後続の数値出力の形式を 16 進数に変更します。
しかし、ストリームに要素を追加するだけでなく、項目の値も変更するマニピュレータが必要な場合はどうすればよいでしょうか。その後に来るのは?この記事では、このようなマニピュレータの作成方法を検討し、簡単な例でその使用例を示します。
状態ストレージを備えたカスタム マニピュレータ
ストリーム上の後続の項目を変更するには、各ストリームに関連付けられた状態情報を保存する必要があります。これは、ios_base::iword 関数と xalloc によって生成されたインデックスを使用して実現できます。
inline int geti() { static int i = ios_base::xalloc(); return i; }
このメカニズムを導入すると、add_one と add_none という 2 つのマニピュレーターを定義できます。 add_one は保存された状態を 1 に設定し、add_none は保存された状態を 0 に設定します。
ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; } ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }
数値出力のカスタマイズ
C の数値出力はファセットによって処理されます。数値出力の動作を変更するには、カスタム ファセットを定義できます。ここでは、格納された状態値によって各数値をインクリメントする 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())); } };
マニピュレータのテスト
カスタム マニピュレータをテストするには、次のようにします。出力ストリームに新しいファセットを埋め込み、マニピュレータを使用して数値出力を変更できます。
int main() { // outputs: 11121011 cout.imbue(locale(locale(), new my_num_put)); cout << add_one << 10 << 11 << add_none << 10 << 11; }
この例では、出力ストリームは数値 10、11、10、11 を値とともに出力します。最初の 2 つの数字にそれぞれ 1 を加算すると、11、12、10、11 になります。
以上がC で後続の出力に影響を与えるカスタム ストリーム マニピュレータを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。