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

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

DDD
リリース: 2024-11-06 10:00:04
オリジナル
642 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート