【问题标题】:Having a class that has a write function, how to I pass it to a function accepting std::ostream&拥有一个具有写入功能的类,如何将其传递给接受 std::ostream& 的函数
【发布时间】:2021-05-29 01:15:55
【问题描述】:

我有一个类的实例,它实现了这样的书写接口:

struct Writer {
    virtual size_t write(const char* buffer, size_t size, size_t offset) = 0;
};

我还有一个函数,它将std::ostream& 作为参数并写入它。像这样:

void foo(std::ostream& os) {
    os << "hello world"; // Say, I don't control this code
}

foo 写入我的Writer 接口实例的最简单方法是什么?

Reader 接口和std::istream 的奖励积分。

编辑:

也许我还应该提到,我必须假设foo 将大量数据写入std::ostream,因此foo 先写入std::stringstream 然后再写入Writer 的解决方案不会工作。

【问题讨论】:

  • 让 foo 接受Writer&amp; 吗?还是让Writerstd::ostream&amp; 进行操作?
  • 您将需要创建自己的派生自ostream 的类,并拥有与Writer 的接口。这同样适用于istream 案例。
  • @StephenNewell 不,在这种情况下我不能修改fooWriter,我只能创建某种包装器,它要么被std::ostream 本身使用,要么派生自它.
  • 也许this question 可以提供帮助。
  • 我会编写一个自定义的std::basic_streambuf 类,输出到Writer,然后实例化一个标准的std::ostream 对象,将我的streambuf 传递给它的构造函数。

标签: c++ std ostream istream


【解决方案1】:

使用来自A custom ostream 的代码,我能够编写:

#include <iostream>
#include <sstream>

struct Writer {
    virtual size_t write(const char* buffer, size_t size, size_t offset) = 0;
};
Writer& getWriter();
void foo(std::ostream& os);

struct WriteToWriter : public std::stringbuf {
    Writer& w;
    std::size_t offset{0};
    WriteToWriter(Writer& w) : w(w) {}
    virtual std::streamsize xsputn(const char_type* s, std::streamsize n) override {        
        const size_t r = w.write(s, n, offset);
        offset += r;
        return r;
    }
    virtual int_type overflow(int_type c) override {
        if (c == EOF) return EOF;
        char tmp = c;
        const size_t r = w.write(&tmp, 1, offset);
        offset += r;
        return r == 1 ? c : EOF ;
    }
};

int main()
{
    WriteToWriter wtw(getWriter());
    std::ostream out(&wtw);
    foo(out);
}

看起来应该直接写信给Writer::write

【讨论】:

  • 我对这个答案有两个问题:(1)这不需要从 std::stringbuf 继承,从 std::streambuf 继承就足够了。 (2)overflow是否真的需要实现。 xsputn documentation 表示 xsputn 可能会调用它,但您编写的版本不会。我做了一些测试,它似乎没有被调用。
  • 1.当然。 2. 是的,有sputc
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 2011-07-14
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 2015-04-12
相关资源
最近更新 更多