我没有注意到的是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";
basic_ios
构造函数取一个basic_streambuf*
已经公开,因为你可以做之前using B::B;
。我希望旧的实现只有一个代理ctor:A(int x) : B(x) {}
-即使B
ctor是,也可以正常工作protected
。