Creazione di un stream di input dalla memoria costante

Ho alcuni dati in un buffer puntato da un puntatore const char* . I dati sono solo una stringa ASCII. Conosco le sue dimensioni. Mi piacerebbe essere in grado di leggerlo nello stesso modo in cui i dati vengono letti dai flussi. Sto cercando una soluzione che mi permetta di scrivere codice come questo:

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

Condizione importante: i dati non devono essere copiati o alterati in alcun modo (altrimenti utilizzerei semplicemente un stream di stringhe. A mia conoscenza, non è ansible creare un stream di stringa da un puntatore const-char senza copiare i dati. )

Il modo per farlo è creare un buffer di stream adatto. Questo può, ad esempio, essere fatto in questo modo:

 #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)) { } }; 

L’unica cosa piuttosto strana è il const_cast() nel buffer del stream: il buffer del stream non cambierà i dati, ma l’interfaccia richiede ancora il char* , principalmente per rendere più semplice la modifica del buffer in ” normali “buffer di stream”. Con questo, puoi usare imemstream come un normale stream di input:

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

L’unico modo sarebbe quello di sottoclass std :: istream (che richiede anche la sottoclass di std :: streambuf) per creare la tua class di stream che legge dalla memoria costante.

Non è così facile come sembra, perché le classi di stream della libreria standard C ++ sono piuttosto disordinate e mal progettate. Non penso che ne valga la pena a meno che non ne abbia bisogno per scalare molto.