如何从 std::istream 加载 wxXmlDocument?

How to load wxXmlDocument from std::istream?

我想从 std::istream 加载 wxXmlDocument 但不幸的是,没有 Load(std::istream&) 成员函数,即使 wxWidget 是使用标准 [=19] 编译的=] 流。

为了它的价值,我在 macOS 上使用 wxWidgets 3.1.0。

我不知道是否有其他选择,但是,由于 wxXmlDocument 提供了 Load(wxInputStream&),解决方案可以是定义这样的适配器:

class myStdInputStreamAdapter : public wxInputStream {
public:
  myStdInputStreamAdapter(std::istream &s): stream{s} {}

protected:
  std::istream &stream;

  virtual size_t OnSysRead(void *buffer, size_t bufsize) {
    std::streamsize size = 0;

    stream.peek();

    if (stream.fail() || stream.bad()) {
      m_lasterror = wxSTREAM_READ_ERROR;
    } else if (stream.eof()) {
      m_lasterror = wxSTREAM_EOF;
    } else {
      size = stream.readsome(static_cast<std::istream::char_type *>(buffer),
                             bufsize);
    }

    return size;
  }
};

然后用它加载 xml:

void f(std::istream &istream) {
    wxXmlDocument xml;

    myStdInputStreamAdapter inputStreamAdapter(istream);

    xml.Load(inputStreamAdapter);
}