所以我实现的IO类在某些情况下在内部使用fstream
,在其他情况下wfstream
。
class IO
{
public:
// open file stream
IO(string filepath, bool iswide);
void read(int val);
void read(bool val);
void read(string val); // if m_iswide == true is not called
void read(wstring val);
void write(int val);
void write(bool val);
void write(string val); // if m_iswide == true is not called
void write(wstring val);
private:
bool m_iswide; ///< use wfstream if true
std::fstream m_fstream;
std::wfstream m_wfstream;
};
是否有任何类型可用作两个流的基类(当然具有读/写接口)?
答案 0 :(得分:3)
我担心这两个类层次结构只能在ios_base
中相遇。您可以创建一个模板,以便用户可以选择其中一个流。
答案 1 :(得分:3)
你做不到。宽字符流完全是一种东西
不同于狭窄的字符流,并使用完全
不同的streambuf
。如果你的班级试图使用两种不同的
实例,它们将有两个不同的缓冲区和两个缓冲区
不同的独立档案位置;从中读取人物
其中一个流不会从输入中删除它们
其他
请注意,即使在C中,尽管您只有一个fopen
,
一旦你访问了它,就可以独立于类型
字符,试图访问它的范围很窄,反之亦然,
是未定义的行为。
答案 2 :(得分:2)
没有。唯一的共同基础是std::ios_base
,这是无用的。
有关层次结构的概述,请参阅http://en.cppreference.com/w/cpp/io
该基类的答案 3 :(得分:1)
您唯一的选择是使用boost :: any和类似的技术来键入 - 擦除流。
对于用于实现此类擦除的技术,请查看here。
这是关于价值语义和基于概念的多态性的讨论。
示例等同于:
class ClassWithCommonInterface {
...
};
ClassWithCommonInterface f(stream);
f.read(...);
...
编辑:重新阅读你的问题我看到你有一组封闭的类型。 使用boost.variant来保存这两种类型。您可以使用访问者根据您使用的类型选择真正的读取操作。
如果需要Boost.TypeErasure,也可以使用引用语义。