Crear una secuencia de entrada desde la memoria constante

Tengo algunos datos en un búfer al que apunta un puntero const char* . Los datos son solo una cadena ASCII. Sé su tamaño. Me gustaría poder leerlo de la misma manera en que se leen los datos de las transmisiones. Estoy buscando una solución que me permita escribir un código como este:

 // 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; 

Condición importante: los datos no se deben copiar ni alterar de ninguna forma (de lo contrario, simplemente utilizaría una secuencia de cadenas. Para mi conocimiento, no es posible crear una cadena de caracteres desde un puntero const char sin copiar los datos. )

La forma de hacerlo es crear un buffer de transmisión adecuado. Esto puede, por ejemplo, hacerse de esta manera:

 #include  #include  struct membuf: std::streambuf { membuf(char const* base, size_t size) { char* p(const_cast(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(this)) { } }; 

Lo único incómodo es el const_cast() en el búfer de transmisión: el búfer de transmisión no cambiará los datos, pero la interfaz aún requiere que se use char* , principalmente para que sea más fácil cambiar el búfer en ” normal “buffers de flujo. Con esto, puedes usar imemstream como un flujo de entrada normal:

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

La única manera sería subclass std :: istream (que también requiere subclassing std :: streambuf) para crear su propia clase de flujo que lea desde la memoria constante.

No es tan fácil como parece, porque las clases de flujo de la biblioteca estándar de C ++ son bastante desordenadas y están mal diseñadas. No creo que valga la pena a menos que lo necesite para escalar mucho.