首页 > 后端开发 > C++ > 正文

如何创建自定义流操纵器来修改 C 中的后续流项目?

DDD
发布: 2024-11-06 10:00:04
原创
580 人浏览过

How Can You Create a Custom Stream Manipulator to Modify Subsequent Stream Items in C  ?

创建修改后续流项目的自定义流操纵器

简介:
在 C 中,流操纵器是对于改变流操作的格式和行为很有用。本文探讨了如何创建可以修改流中跟随它们的项目的自定义操纵器。

创建“添加一个”操纵器:
考虑中描述的“plusone”操纵器问题:

int num2 = 1;
std::cout << "1 + 1 = " << plusone << num2; // "1 + 1 = 2"
std::cout << num2; // "1"
登录后复制

要实现这个操纵器,我们需要实现两件事:

  1. 存储状态:每个流必须维护一个内部状态,指示下一项是否应该递增。
  2. 挂钩数字输出: 数字输出操作由分面执行。我们可以定义一个自定义方面,在输出之前修改数字。

存储状态:
我们使用流字存储将状态与流关联起来:

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()));
    }
};
登录后复制

此分面根据存储在中的状态在输出数字之前递增数字

测试操纵器:

int main() {
    // outputs: 11121011
    cout.imbue(locale(locale(),new my_num_put));
    cout << add_one << 10 << 11 << add_none << 10 << 11;
}
登录后复制

将增量限制为下一个项目:
仅增量下一个项目item,在每次 do_put 操作后将流状态重置为 0。

以上是如何创建自定义流操纵器来修改 C 中的后续流项目?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!