【问题标题】:check if something was serialized in std::ostream检查是否在 std::ostream 中序列化了某些内容
【发布时间】:2013-07-26 23:38:55
【问题描述】:

有没有一种简单的方法可以检查某些内容是否在 stl::ostream.我正在寻找类似的东西:

some preparation

// ... a very complex code that may result in adding or not to the stream,
// that I will prefer not to change

check if the stream has something added

请注意,这需要递归工作。使用 register_callback 是个好主意还是有更简单的方法?

【问题讨论】:

    标签: c++ stl ostream


    【解决方案1】:

    首先是直接的问题:register_callback() 旨在处理存储在pword() 中的资源的适当复制和释放,并且将仅进行与此相关的操作(即复制、分配和释放以及观察std::locale 的变化)。所以,不,这对你一点帮助都没有。

    但是,您可以做的是创建一个过滤流缓冲区,以观察是否有写入流,例如,如下所示:

    class changedbuf: std::streambuf {
        std::streambuf* d_sbuf;
        bool            d_changed;
        int_type overflow(int_type c) {
             if (!traits_type::eq_int_type(c, traits_type::eof())) {
                 this->d_changed = true;
             }
             return this->d_sbuf->sputc(c);
        }
    public:
        changedbuf(std::streambuf* sbuf): d_sbuf(d_sbuf), d_changed() {}
        bool changed() const { return this->d_changed; }
    }
    

    您可以使用它来代替您已经拥有的std::ostream,例如:

    void f(std::ostream& out) {
        changedbuf   changedbuf(out.rdbuf());
        std::ostream changedout(&changedbuf);
        // use changedout instead of out; if you need to use a global objects, you'd
        // replace/restore the used stream buffer using the version of rdbuf() taking
        // an argument
        if (changedbuf.change()) {
            std::cout << "there was a change\n";
        }
    }
    

    真正的实现实际上会提供一个缓冲区并处理正确的刷新(即覆盖sync())和序列输出(即覆盖xsputn())。但是,上述版本足以作为概念验证。

    其他人可能会建议使用std::ostringstream。根据写入的数据量,这很容易成为性能问题,尤其是与适当处理缓冲的高级版本 changedbuf 相比。

    【讨论】:

      【解决方案2】:

      您是将流传递给复杂代码,还是全局可见?可以是任何类型的ostream,还是可以将类型限制为ofstreamostringstream

      如果您的 ostream 类型支持它(例如大多数fstreams),您可以使用tellp 来确定自您的准备代码以来文件位置是否发生了变化。或者,如果您要传入流,则可以传入一个空的ostringstream,并在提取字符串以打印输出时检查它是否为空。

      在不了解代码上下文和问题细节的情况下,哪种解决方案适合您(如果有的话)并不完全清楚。最好的答案可能是返回(或设置为按引用的输出参数)一个标志,指示是否将流插入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-22
        • 2012-02-03
        相关资源
        最近更新 更多