为什么 std::basic_ios 有一个公共构造函数?

Why does std::basic_ios have a public constructor?

本文关键字:构造函数 有一个 ios std basic 为什么      更新时间:2023-10-16

std::basic_ios有一个公共构造函数:

explicit basic_ios (std::basic_streambuf<CharT,Traits>* sb);

IMO,类具有公共构造函数的唯一原因是在程序中使用该类的独立实例。 如果一个类的存在只是为了让其他类从它派生(就像basic_ios的情况一样(,那么该类的所有构造函数都应该protectedstd::ios_base的构造函数都受到保护。 但是,出于某种原因,该标准的设计者将这个构造函数公开basic_ios

basic_ios被用作几种流类型的基类,我无法想象一个用例,即您至少不是basic_istreambasic_ostream。 有吗?

类具有公共构造函数的另一个原因是具有此构造函数签名可用于构造派生对象:

struct B{
B(int);
protected:
~B();
};
struct A:B{
private://no effect.
using B::B;
public:
A(void*);
};
A a(10);

构造函数在基类中必须是公共的,因为基构造函数的 using 声明不会更改继承构造函数的可访问性。

我没有注意到的是,std::basic_istreamstd::basic_ostreamstd::basic_iostream也有公共构造函数(每个都需要一个std::basic_streambuf*(。

这允许多态性的泛型编程类似物,与痘痘习语相同。

也就是说,通过这种方式,您可以创建专用的 streambuf 类型并在basic_[io]stream中使用它,而无需创建专用的流类。(功能有限:不能将新缓冲区分配给同一流,并且必须在外部跟踪缓冲区的生存期和所有权(。

专用basic_[io]fstreambasic_[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, worldn";