微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决有一个具有 write 函数的类,如何将它传递给接受 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 的奖励积分。

编辑:

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

解决方法

使用来自 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。