最近想要做一个日志输出接口,想用类似std::cout这种流式输出方法,研究了一下C++的标准输入输出库 iostream
图片摘自cppreference:
- ios_base,basic_ios不需要过多关注,是一些基础结构和接口定义,基本用不到
- basic_ostream用于流式输出(std::cout实现自这个类),basic_istream用于流式输入(std::cin实现自这个类),如果想要通过流的方式处理数据就得用到这两个类,iostream是他们两个的合集。
- basic_ofstream,basic_ostringstream则是输出的两个具体实现,一个用于输出数据到文件,一个用于输出数据到字符串,basic_ifstream,basic_istringstream与之对应,用于读取文件和读取数据
我们的Log模块就需要用到basic_ostream这样的流输出接口。basic_ostream定义了一套输出接口,put/write/<<这三种输出方式,所以我们让Log继承自std::basic_ostream<char>这个类,支持对char字符串的流式输出。basic_ostream需要一个streambuf用于存放输出的数据,我们Log要输出到文件中,所以文件的buf自然就作为basic_ostream的buf了。