首頁 >後端開發 >C++ >如何在 C 中建立自訂流操縱器來遞增下一個輸出的整數?

如何在 C 中建立自訂流操縱器來遞增下一個輸出的整數?

Patricia Arquette
Patricia Arquette原創
2024-11-06 11:13:02178瀏覽

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

創建修改流上下一項的自定義流操縱器

在C 中,十六進制流操縱器提供了一種以十六進制格式列印整數的便利方法。本文探討如何建立一個自訂流操縱器來修改流上的下一個項目。

具體來說,我們的目標是創建一個 plusone 操縱器,將列印的下一個整數的值增加 1。為了實現這一點,我們需要在每個流程中儲存一些狀態。為此,我們可以使用 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn