从常量内存创buildinputstream

我有一个const char*指针指向的缓冲区中的一些数据。 数据只是一个ASCIIstring。 我知道它的大小。 我希望能够以同样的方式从数据stream中读取数据。 我正在寻找一个解决scheme,让我写这样的代码:

 // for example, data points to a string "42 3.14 blah" MemoryStreamWrapper in(data, data_size); int x; float y; std::string w; in >> x >> y >> w; 

重要的条件: 数据不能被复制或以任何方式改变 (否则我只是使用一个stringstream。据我所知,不能复制数据从const字符指针创build一个stringstream。 )

这样做的方法是创build一个合适的stream缓冲区。 这可以,例如,这样做:

 #include <streambuf> #include <istream> struct membuf: std::streambuf { membuf(char const* base, size_t size) { char* p(const_cast<char*>(base)); this->setg(p, p, p + size); } }; struct imemstream: virtual membuf, std::istream { imemstream(char const* base, size_t size) : membuf(base, size) , std::istream(static_cast<std::streambuf*>(this)) { } }; 

唯一有些尴尬的是stream缓冲区中的const_cast<char*>() :stream缓冲区不会改变数据,但接口仍然需要使用char* ,主要是为了更容易地改变“正常“的stream缓冲区。 有了这个,你可以使用imemstream作为一个正常的inputstream:

 imemstream in(data, size); in >> value; 

唯一的方法是inheritancestd :: istream(它也需要inheritancestd :: streambuf)来创build自己的stream类,它从常量内存中读取。

这并不像听起来那么容易,因为C ++标准库stream类是相当混乱和糟糕的devise。 我不认为这是值得的,除非你需要它扩大很多。