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

C で後続のストリーム項目を変更するカスタム ストリーム マニピュレータを作成するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-06 10:00:04580ブラウズ

How Can You Create a Custom Stream Manipulator to Modify Subsequent Stream Items in C  ?

後続のストリーム アイテムを変更するカスタム ストリーム マニピュレータの作成

はじめに:
C では、ストリーム マニピュレータは次のとおりです。ストリーム操作の形式と動作を変更するのに役立ちます。この記事では、ストリーム上で後続するアイテムを変更できるカスタム マニピュレータを作成する方法について説明します。

「Add One」マニピュレータの作成:
で説明されている「plusone」マニピュレータについて考えてみましょう。質問:

int num2 = 1;
std::cout << "1 + 1 = " << plusone << num2; // "1 + 1 = 2"
std::cout << num2; // "1"

このマニピュレータを実装するには、次の 2 つのことを達成する必要があります:

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

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