一件小事

神奇,C++竟然可以通过增加一个编译的源文件来改变输出的位置和内容。

例子:

helloworld.cpp

#include <iostream>
using std::cout;

int main()
{
    cout << "Hello World!\n";
}

helper.cpp

#include <iostream>
#include <sstream>
using std::cout;
using std::streambuf;
using std::stringstream;

class Helper
{
public:
	Helper()
		: m_original_buffer(cout.rdbuf())
	{
		cout.rdbuf(m_output.rdbuf());
	}

	~Helper()
	{
		cout.rdbuf(m_original_buffer);  // 把缓冲区改回来
		cout << "m_output的缓冲区:" << m_output.rdbuf() << '\n';  // 输出m_output的缓冲区里面的内容
	}
private:
	stringstream m_output;  // 这个是cout输出到的位置
	streambuf* m_original_buffer;  // 这个是cout原来的缓冲区
} helper;

编译&运行:

g++ helloworld.cpp helper.cpp -o helloworld && ./helloworld

结果:

m_output的缓冲区:Hello World!