自定义 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();
}