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