在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中文網其他相關文章!