我想创建一个自定义输入文件流,它会自动去除评论和其他垃圾数据。我想出了以下解决方案:
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
以类似方式忽略评论和其他数据的自定义?