C++: ベクターのラッピング istreamで質問する

C++: ベクターのラッピング istreamで質問する

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メソッドをオーバーライドします。

おすすめ記事