我想創建一個自動刪除註釋和其他垃圾數據的自定義輸入文件流。我想出了以下解決方案:爲什麼不從ifstream繼承
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() {... }
};
我也有含Serialize/Deserialize
方法接口ISerializable
。一切看起來都很好。
但我讀過,我不應該從std::ifstream
繼承,並應該創建自定義std::streambuf
。
您能否解釋爲什麼從std::ifstream
繼承不好,以及如何創建自定義std::streambuf
,以類似的方式忽略註釋和其他數據?