我有一个缓存一些数据被指出const char*
指针。 这些数据仅仅是一个ASCII字符串。 我知道它的大小。 我希望能够以同样的方式读取数据是从流读取。 我正在寻找一个解决办法,让我写这样的代码:
// 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;
重要条件: 数据不得复制或以任何方式 (否则我只是使用一个字符串流,以我所知,这是不可能不将数据复制到创建一个const char指针字符串流改变 。 )
做到这一点的方法是创建一个合适的流缓冲区。 这可以,例如,就像这样:
#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)) {
}
};
唯一有点尴尬的事情是const_cast<char*>()
在流缓存:流缓冲区不会改变数据,但界面仍然需要char*
被使用,主要是为了让它更容易改变的缓冲区“正常的”流缓冲。 有了这个,你可以使用imemstream
作为一个正常的输入流:
imemstream in(data, size);
in >> value;
唯一的办法是子类的std :: istream的(这也需要子类的std ::流缓冲)来创建自己的流类,从常量内存中读取。
这不是因为它的声音,因为C ++标准库的流类是相当混乱和糟糕的设计一样简单。 我不认为这是值得的,除非你需要它扩展了很多。