コメントやその他の不要なデータを自動的に削除するカスタム入力ファイル ストリームを作成したいと考えています。私は次の解決策を思いつきました:
class FileReader : public std::ifstream
{
public:
explicit FileReader(const char* fName) { open(fName); }
~FileReader() { if (is_open()) close(); }
template <typename T, bool IsBaseOfSerializable>
struct DoRead
{
void operator()(std::ifstream& ifs, T& data) { ifs >> data; }
};
template <typename T>
struct DoRead<T, true>
{
void operator()(FileReader& reader, T& data) { data.Deserialize(reader); }
};
template <typename T>
friend FileReader& operator>>(FileReader& reader, T& data)
{
reader.SkipCommentsAndGarbage();
DoRead<T, std::is_base_of<ISerializable, T>::value> doread;
doread(reader, data);
return reader;
}
void SkipCommentsAndGarbage() {... }
};
ISerializable
メソッドを含むインターフェースもありますSerialize/Deserialize
。私にはすべてがうまく見えます。
しかし、私は決して継承してはならず、std::ifstream
custom を作成する必要があることを読みましたstd::streambuf
。
なぜ継承するのが悪いのか、コメントやその他のデータを同様に無視std::ifstream
するカスタムを作成するにはどうすればよいか説明していただけますか?std::streambuf