vector<char>
をラップしたいstd::istream
(ベクトルの読み取りはインターフェースを通じて行われるistream
)
どうすればいいですか?
ベストアンサー1
streambuf
をラップするサブクラスを定義しvector
、そのインスタンスを istream コンストラクターに渡します。
構築後にデータが変更されない場合は、 を使用してデータ ポインターを設定するだけで十分ですstreambuf::setg()
。他のメンバーのデフォルトの実装は適切に機能します。
template<typename CharT, typename TraitsT = std::char_traits<CharT> >
class vectorwrapbuf : public std::basic_streambuf<CharT, TraitsT> {
public:
vectorwrapbuf(std::vector<CharT> &vec) {
setg(vec.data(), vec.data(), vec.data() + vec.size());
}
};
std::vector<char> data;
// ...
vectorwrapbuf<char> databuf(data)
std::istream is(&databuf);
それ以上に高度な処理が必要な場合は、streambuf::underflow
メソッドをオーバーライドします。