내가 통지에 실패하면 해당이었다 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_ios
cson을 복용 한 ctor가basic_streambuf*
당신이 할 수 있기 전에 공개 된 적이 있습니다using B::B;
. 이전 구현에는 프록시 ctor가 있다고 기대합니다.A(int x) : B(x) {}
-B
ctor가 c 인 경우에도 제대로 작동합니다protected
.