gpt4 book ai didi

c++ - 对 C++ 多态、可查找、二进制 I/O 接口(interface)的建议

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:49:46 25 4
gpt4 key购买 nike

我一直在使用 std::istreamostream 作为 C++ 中随机访问二进制 I/O 的多态接口(interface),但它在许多方面似乎都不是最佳选择:

  • 由于 streampos/streamoff 限制,64 位搜索不可移植且容易出错;目前正在使用 boost/iostreams/positioning.hpp作为解决方法,但需要保持警惕
  • 缺少截断或扩展文件等操作(ala POSIX ftruncate)
  • 具体实现之间的不一致;例如stringstream 有独立的 get/put 位置而 filestream 没有
  • 平台实现之间的不一致;例如寻求传递文件末尾的行为或使用 failbit/badbit 错误
  • 不需要 stream 的所有格式化工具,甚至可能不需要 streambuf 的缓冲
  • streambuf 错误报告(即异常与返回错误指示符)应该是 implementation-dependent在实践中

我喜欢 Boost.Iostreams Device concept 提供的简化界面,但它是作为函数模板而不是多态类提供的。 (有一个 device class ,但它不是多态的,只是一个实现辅助类,不一定由提供的设备实现使用。)我主要使用大磁盘文件,但我真的想要多态性,所以我可以轻松地替换替代实现(例如,使用 stringstream 而不是 fstream 进行单元测试)没有深度模板实例化的所有复杂性和编译时耦合。

有没有人对此有任何标准方法的建议?这似乎是一种常见的情况,所以我不想不必要地发明自己的接口(interface)。例如,像 java.nio.FileChannel 这样的东西看起来很理想。

到目前为止,我最好的解决方案是在 Boost.Iostreams 设备之上放置一个薄的多态层。例如:

class my_istream
{
public:
virtual std::streampos seek(stream_offset off, std::ios_base::seekdir way) = 0;
virtual std::streamsize read(char* s, std::streamsize n) = 0;
virtual void close() = 0;
};

template <class T>
class boost_istream : public my_istream
{
public:
boost_istream(const T& device) : m_device(device)
{
}

virtual std::streampos seek(stream_offset off, std::ios_base::seekdir way)
{
return boost::iostreams::seek(m_device, off, way);
}

virtual std::streamsize read(char* s, std::streamsize n)
{
return boost::iostreams::read(m_device, s, n);
}

virtual void close()
{
boost::iostreams::close(m_device);
}

private:
T m_device;
};

最佳答案

您看过 Qt 的 QIODevice 类和子类吗?我不太确定它是否符合您的需要,但也许值得一试:QIODevice .

关于c++ - 对 C++ 多态、可查找、二进制 I/O 接口(interface)的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3048946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com