fstream和wfstream的基类

时间:2014-10-23 10:31:32

标签: c++ fstream

所以我实现的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;
};

问题

是否有任何类型可用作两个流的基类(当然具有读/写接口)?

4 个答案:

答案 0 :(得分:3)

我担心这两个类层次结构只能在ios_base中相遇。您可以创建一个模板,以便用户可以选择其中一个流。

答案 1 :(得分:3)

你做不到。宽字符流完全是一种东西 不同于狭窄的字符流,并使用完全 不同的streambuf。如果你的班级试图使用两种不同的 实例,它们将有两个不同的缓冲区和两个缓冲区 不同的独立档案位置;从中读取人物 其中一个流不会从输入中删除它们 其他

请注意,即使在C中,尽管您只有一个fopen, 一旦你访问了它,就可以独立于类型 字符,试图访问它的范围很窄,反之亦然, 是未定义的行为。

答案 2 :(得分:2)

没有。唯一的共同基础是std::ios_base,这是无用的。

有关层次结构的概述,请参阅http://en.cppreference.com/w/cpp/io

该基类的

http://en.cppreference.com/w/cpp/io/ios_base

答案 3 :(得分:1)

您唯一的选择是使用boost :: any和类似的技术来键入 - 擦除流。

查看Boost.TypeErasure

对于用于实现此类擦除的技术,请查看here

这是关于价值语义和基于概念的多态性的讨论。

示例等同于:

class ClassWithCommonInterface {
 ...
};

ClassWithCommonInterface f(stream);

f.read(...);
...

编辑:重新阅读你的问题我看到你有一组封闭的类型。 使用boost.variant来保存这两种类型。您可以使用访问者根据您使用的类型选择真正的读取操作。

如果需要Boost.TypeErasure,也可以使用引用语义。