我正在尝试通过扩展std::streambuf
. 作为一个学习实验,我的目标是简单地创建一个自定义流,将所有输出定向到std::cerr
. 看起来很简单:
#include <iostream>
using namespace std;
class my_ostreambuf : public std::streambuf
{
public:
protected:
std::streamsize xsputn(const char * s, std::streamsize n)
{
std::cerr << "Redirecting to cerr: " << s << std::endl;
return n;
}
};
int main()
{
my_ostreambuf buf;
std::ostream os(&buf);
os << "TEST";
}
这似乎有效,因为它打印Redirecting to cerr: TEST
. 问题是当单个字符(而不是字符串)通过. 例如:std::ostream::sputc
int main()
{
my_ostreambuf buf;
std::ostream os(&buf);
os << "ABC"; // works
std::string s("TEST");
std::copy(s.begin(), s.end(), std::ostreambuf_iterator<char>(os)); // DOESN'T WORK
}
我猜的问题是它xsputn
不处理单个字符插入。(我想sputc
不会在xsputn
内部调用?)但是,查看中的虚拟受保护函数列表,std::streambuf
我看不到任何我应该重写的处理单个字符插入的函数。
那么,我该如何实现呢?