ホームページ  >  記事  >  バックエンド開発  >  C で後続の出力に影響を与えるカスタム ストリーム マニピュレータを作成するにはどうすればよいですか?

C で後続の出力に影響を与えるカスタム ストリーム マニピュレータを作成するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-06 15:23:02425ブラウズ

How to Create Custom Stream Manipulators that Affect Subsequent Outputs in C  ?

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&amp; 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&amp; 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。