我有一个类的实例,它实现了如下的书写接口:
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
的解决方案将不起作用。
使用自定义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