自定义 ostream

下面的代码继承了 std::streambuf 改变了 ostream 的行为,并自定义了打印操作将结果送到 stdout,而不是 std::cout 中(当然也可以更改逻辑修改打印的细节)。

其中的 print 函数是仿 C++23 std::print 的,功能仅仅是打印参数,在笔记 实现简单的花括号插值打印 中实现。

struct membuf : std::streambuf {
    membuf(char *p, size_t n) {
        setg(p, p, p + n);  // set read pointers
        setp(p, p + n);
    }

    void flush() {
        auto p = pbase(), e = pptr();
        fwrite(p, 1, e - p, stdout);
        setp(p, e);  // reset write pointers
    }

   private:
    int overflow(int c) override {
        flush();
        if (c != '\0') fputc(c, stdout);
        return c;
    }
};

// A little slower since we have to maintain a different buffer.
template <class... Ts>
void print_stdout(const char *s, Ts... args) {
    char buf[512];
    membuf mbuf(buf, sizeof(buf));
    std::ostream os(&mbuf);
    print(os, s, args...);
    mbuf.flush();
}