내가 통지에 실패하면 해당이었다 std::basic_istream, std::basic_ostream그리고 std::basic_iostream(각각 소요 공공 생성자를했다 std::basic_streambuf*).
이것은 pimpl 관용구와 같은 맥락에서 다형성의 일반적인 프로그래밍 유사체를 허용합니다.
즉, 이렇게하면 특수 스트림 클래스 형식을 만들어 특수 스트림 클래스를 만들 필요없이 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_ioscson을 복용 한 ctor가basic_streambuf*당신이 할 수 있기 전에 공개 된 적이 있습니다using B::B;. 이전 구현에는 프록시 ctor가 있다고 기대합니다.A(int x) : B(x) {}-Bctor가 c 인 경우에도 제대로 작동합니다protected.