我没有注意到的是std::basic_istream
,std::basic_ostream
并且std::basic_iostream
还有公共构造函数(每个都需要一个std::basic_streambuf*
)。
这允许与 pimpl 习惯用法相同的多态性的通用编程类似物。
也就是说,通过这种方式,您可以创建一个专门的 streambuf 类型并在basic_
[io]中使用它,stream
而无需创建专门的流类。(功能有限:您不能将新缓冲区分配给同一流,并且您必须在外部跟踪缓冲区的生命周期和所有权)。
专门的basic_
[io]fstream
和basic_
[io]stringstream
每个都包含相关缓冲区类型的完整实例。这意味着专用流类型的实例只能与它的内部缓冲区一起工作,而不是另一个,甚至不是同一类型的一个。使用原始basic_
[io]stream
是一种(笨拙的)解决方法。
template<class C, class TR>
class snazzy_filebuf: public std::basic_streambuf<C, TR>
{
protected:
typename TR::int_type overflow(TR::int_type) override;
typename TR::int_type underflow(TR::int_type) override;
typename TR::int_type pbackfail(TR::int_type) override;
public:
snazzy_filebuf();
};
.....
snazzy_filebuf<char> buf;
std::basic_ostream<char> o_s(&buf);
o_s << "Hello, world\n";