有一个具有写入函数的类,如何将其传递给接受 std::ostream& 的函数



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

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的加分项。

编辑:

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

使用自定义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

相关内容

最新更新