後続のストリーム アイテムを変更するカスタム ストリーム マニピュレータの作成
はじめに:
C では、ストリーム マニピュレータは次のとおりです。ストリーム操作の形式と動作を変更するのに役立ちます。この記事では、ストリーム上で後続するアイテムを変更できるカスタム マニピュレータを作成する方法について説明します。
「Add One」マニピュレータの作成:
で説明されている「plusone」マニピュレータについて考えてみましょう。質問:
int num2 = 1; std::cout << "1 + 1 = " << plusone << num2; // "1 + 1 = 2" std::cout << num2; // "1"
このマニピュレータを実装するには、次の 2 つのことを達成する必要があります:
状態の保存:
ストリーム ワード ストレージを使用して状態をストリームに関連付けます:
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())); } };
このファセットは、に保存されている状態に基づいて、出力する前に数値をインクリメントします。
マニピュレータのテスト:
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 サイトの他の関連記事を参照してください。