C で次に出力される整数をインクリメントするカスタム ストリーム マニピュレーターを作成するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-06 11:13:02
オリジナル
106 人が閲覧しました

How to Create a Custom Stream Manipulator that Increments the Next Outputted Integer in C  ?

ストリーム上の次の項目を変更するカスタム ストリーム マニピュレータの作成

C では、16 進ストリーム マニピュレータを使用して、整数を 16 進形式で出力する便利な方法が提供されます。この記事では、ストリーム上の次の項目を変更するカスタム ストリーム マニピュレータの作成方法について説明します。

具体的には、出力される次の整数の値を 1 ずつ増やす plusone マニピュレータを作成することを目的としています。これを実現するには、次のようにします。各ストリームに何らかの状態を保存する必要があります。この目的のために、iword 関数と xalloc によって割り当てられたインデックスを使用できます。

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())); 
    } 
}; 
ログイン後にコピー

このファセットは、ストリーム状態に格納されている値を、出力される数値に追加します。

ここで、 plusone マニピュレータをテストできます。

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 までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!