用于更改后续流项目的自定义 C 流操纵器
在 C 中,十六进制操纵器可用于将数字转换为其十六进制表示形式。但是,如果您不仅需要修改当前项目,还需要修改流中的后续项目,该怎么办?
创建 plusone 操纵器
创建一个递增流上的下一个数值,请按照以下步骤操作:
1。在每个流上存储状态:
使用 iword 和 geti() 在每个流上存储状态。
inline int geti() { static int i = ios_base::xalloc(); return i; }
2.定义操纵器函数:
创建函数来设置和取消设置存储的状态。
ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; } ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }
3.拦截数字输出:
创建 my_num_put 分面来拦截数字输出并应用存储的增量。
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())); } };
4.测试操纵器:
使用操纵器递增下一个数值并显示结果。
int main() { // outputs: 11121011 cout.imbue(locale(locale(),new my_num_put)); cout << add_one << 10 << 11 << add_none << 10 << 11; }
重置一次性增量:
如果您只想增加下一个数字,请在每次调用 do_put 后重置存储的状态。
以上是如何创建自定义 C Stream 操纵器来修改后续流项目?的详细内容。更多信息请关注PHP中文网其他相关文章!